xref: /XiangShan/src/main/scala/xiangshan/backend/decode/VecDecoder.scala (revision 9cf1e44e91ce75be8c3ad0382ebd492ed24af96d)
17f2b7720SXuan Hupackage xiangshan.backend.decode
27f2b7720SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.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._
130bca6cb3SZiyue Zhangimport yunsuan.{VfpuType, VipuType, VimacType, VpermType, VialuFixType, VfaluType, VfmaType, VfdivType, VfcvtType, VidivType}
147e30d16cSZhaoyang Youimport xiangshan.backend.decode.Zvbb._
157f2b7720SXuan Hu
16b65b9ebaSXuan Huabstract class VecDecode extends XSDecodeBase {
177f2b7720SXuan Hu  def generate() : List[BitPat]
187f2b7720SXuan Hu  def asOldDecodeOutput(): List[BitPat] = {
19912e2179SXuan Hu    val src1::src2::src3::fu::fuOp::xWen::fWen::vWen::mWen::vxsatWen::xsTrap::noSpec::blockBack::flushPipe::selImm::Nil = generate()
207f2b7720SXuan Hu    List (src1, src2, src3, fu, fuOp, xWen, fWen, xsTrap, noSpec, blockBack, flushPipe, selImm)
217f2b7720SXuan Hu  }
22912e2179SXuan Hu  def asFirstStageDecodeOutput(): List[BitPat] = {
23912e2179SXuan Hu    val src1::src2::src3::fu::fuOp::xWen::fWen::vWen::mWen::vxsatWen::xsTrap::noSpec::blockBack::flushPipe::selImm::Nil = generate()
24912e2179SXuan Hu    List (src1, src2, src3, fu, fuOp, xWen, fWen, bitPatToUInt(vWen) | bitPatToUInt(mWen), xsTrap, noSpec, blockBack, flushPipe, selImm)
25912e2179SXuan Hu  }
267f2b7720SXuan Hu}
277f2b7720SXuan Hu
2872d67441SXuan Hucase class OPIVV(
2972d67441SXuan Hu  fu: FuType.OHType,
3072d67441SXuan Hu  fuOp: BitPat,
3172d67441SXuan Hu  vWen: Boolean,
3272d67441SXuan Hu  mWen: Boolean,
3372d67441SXuan Hu  vxsatWen: Boolean,
3472d67441SXuan Hu  uopSplitType: BitPat = UopSplitType.VEC_VVV,
3572d67441SXuan Hu  src1: BitPat = SrcType.vp,
3672d67441SXuan Hu  src2: BitPat = SrcType.vp,
3772d67441SXuan Hu  src3: BitPat = SrcType.vp
3872d67441SXuan Hu) extends XSDecodeBase {
397f2b7720SXuan Hu  def generate() : List[BitPat] = {
4072d67441SXuan Hu    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
41b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
427f2b7720SXuan Hu  }
437f2b7720SXuan Hu}
447f2b7720SXuan Hu
4572d67441SXuan Hucase class OPIVX(
4672d67441SXuan Hu  fu: FuType.OHType,
4772d67441SXuan Hu  fuOp: BitPat,
4872d67441SXuan Hu  vWen: Boolean,
4972d67441SXuan Hu  mWen: Boolean,
5072d67441SXuan Hu  vxsatWen: Boolean,
5172d67441SXuan Hu  uopSplitType: BitPat = UopSplitType.VEC_VXV,
5272d67441SXuan Hu  src1: BitPat = SrcType.xp,
5372d67441SXuan Hu  src2: BitPat = SrcType.vp,
5472d67441SXuan Hu  src3: BitPat = SrcType.vp
5572d67441SXuan Hu) extends XSDecodeBase {
5658c35d23Shuxuan0307  def generate() : List[BitPat] = {
5772d67441SXuan Hu    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
58b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
5958c35d23Shuxuan0307  }
607f2b7720SXuan Hu}
617f2b7720SXuan Hu
6272d67441SXuan Hucase class OPIVI(
6372d67441SXuan Hu  fu: FuType.OHType,
6472d67441SXuan Hu  fuOp: BitPat,
6572d67441SXuan Hu  vWen: Boolean,
6672d67441SXuan Hu  mWen: Boolean,
6772d67441SXuan Hu  vxsatWen: Boolean,
6872d67441SXuan Hu  selImm: BitPat = SelImm.IMM_OPIVIS,
69d6059658SZiyue Zhang  uopSplitType: BitPat = UopSplitType.VEC_VXV,
7072d67441SXuan Hu  src1: BitPat = SrcType.imm,
7172d67441SXuan Hu  src2: BitPat = SrcType.vp,
7272d67441SXuan Hu  src3: BitPat = SrcType.vp
7372d67441SXuan Hu) extends XSDecodeBase {
7458c35d23Shuxuan0307  def generate() : List[BitPat] = {
7572d67441SXuan Hu    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType,
76b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
7758c35d23Shuxuan0307  }
787f2b7720SXuan Hu}
797f2b7720SXuan Hu
8072d67441SXuan Hucase class OPMVV(
8172d67441SXuan Hu  vdRen: Boolean,
8272d67441SXuan Hu  fu: FuType.OHType,
8372d67441SXuan Hu  fuOp: BitPat,
8472d67441SXuan Hu  xWen: Boolean,
8572d67441SXuan Hu  vWen: Boolean,
8672d67441SXuan Hu  mWen: Boolean,
8772d67441SXuan Hu  uopSplitType: BitPat = UopSplitType.dummy,
8872d67441SXuan Hu  src1: BitPat = SrcType.vp,
8972d67441SXuan Hu  src2: BitPat = SrcType.vp
9072d67441SXuan Hu) extends XSDecodeBase {
91c6661c33SHaojin Tang  private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X
927f2b7720SXuan Hu  def generate() : List[BitPat] = {
9372d67441SXuan Hu    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType, xWen, F, vWen, mWen, F, F, F, F).generate()
947f2b7720SXuan Hu  }
957f2b7720SXuan Hu}
967f2b7720SXuan Hu
9772d67441SXuan Hucase class OPMVX(
9872d67441SXuan Hu  vdRen: Boolean,
9972d67441SXuan Hu  fu: FuType.OHType,
10072d67441SXuan Hu  fuOp: BitPat,
10172d67441SXuan Hu  xWen: Boolean,
10272d67441SXuan Hu  vWen: Boolean,
10372d67441SXuan Hu  mWen: Boolean,
10472d67441SXuan Hu  uopSplitType: BitPat = UopSplitType.dummy,
10572d67441SXuan Hu  src1: BitPat = SrcType.xp,
10672d67441SXuan Hu  src2: BitPat = SrcType.vp
10772d67441SXuan Hu) extends XSDecodeBase {
108c6661c33SHaojin Tang  private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X
109c6661c33SHaojin Tang  def generate() : List[BitPat] = {
11072d67441SXuan Hu    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
111b65b9ebaSXuan Hu      xWen = xWen, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
112c6661c33SHaojin Tang  }
1137f2b7720SXuan Hu}
1147f2b7720SXuan Hu
11572d67441SXuan Hucase class OPFVV(
11672d67441SXuan Hu  src1: BitPat,
11772d67441SXuan Hu  src3: BitPat,
11872d67441SXuan Hu  fu: FuType.OHType,
11972d67441SXuan Hu  fuOp: BitPat,
12072d67441SXuan Hu  fWen: Boolean,
12172d67441SXuan Hu  vWen: Boolean,
12272d67441SXuan Hu  mWen: Boolean,
12372d67441SXuan Hu  uopSplitType: BitPat = UopSplitType.dummy,
12472d67441SXuan Hu  src2: BitPat = SrcType.vp
12572d67441SXuan Hu) extends XSDecodeBase {
126b448988dSczw  def generate() : List[BitPat] = {
12772d67441SXuan Hu    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
128b65b9ebaSXuan Hu      xWen = F, fWen = fWen, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
129b448988dSczw  }
1307f2b7720SXuan Hu}
1317f2b7720SXuan Hu
1324b136a73Ssinsanctioncase class OPFFF(src1: BitPat, src2: BitPat, src3: BitPat, fu: FuType.OHType, fuOp: BitPat, xWen: Boolean, fWen: Boolean, vWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase {
133bdda74fdSxiaofeibao-xjtu  def generate() : List[BitPat] = {
1344b136a73Ssinsanction    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
135bdda74fdSxiaofeibao-xjtu      xWen = xWen, fWen = fWen, vWen = vWen, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F, canRobCompress = T).generate()
136bdda74fdSxiaofeibao-xjtu  }
137bdda74fdSxiaofeibao-xjtu}
138bdda74fdSxiaofeibao-xjtu
13972d67441SXuan Hucase class OPFVF(
14072d67441SXuan Hu  src1: BitPat,
14172d67441SXuan Hu  src3: BitPat,
14272d67441SXuan Hu  fu: FuType.OHType,
14372d67441SXuan Hu  fuOp: BitPat,
14472d67441SXuan Hu  fWen: Boolean,
14572d67441SXuan Hu  vWen: Boolean,
14672d67441SXuan Hu  mWen: Boolean,
14772d67441SXuan Hu  uopSplitType: BitPat = UopSplitType.dummy,
14872d67441SXuan Hu  src2: BitPat = SrcType.vp
14972d67441SXuan Hu) extends XSDecodeBase {
1507f2b7720SXuan Hu  def generate() : List[BitPat] = {
1519bb931c8Sxiaofeibao-xjtu    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
152b65b9ebaSXuan Hu      xWen = F, fWen = fWen, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
1537f2b7720SXuan Hu  }
1547f2b7720SXuan Hu}
1557f2b7720SXuan Hu
1561436b764SZiyue Zhangcase class VSET(vli: Boolean, vtypei: Boolean, fuOp: BitPat, flushPipe: Boolean, blockBack: Boolean, selImm: BitPat, uopSplitType: BitPat = UopSplitType.VSET) extends XSDecodeBase {
157912e2179SXuan Hu  def generate() : List[BitPat] = {
158912e2179SXuan Hu    val src1 = if (vli) SrcType.imm else SrcType.xp
159912e2179SXuan Hu    val src2 = if (vtypei) SrcType.imm else SrcType.xp
16017ec87f2SXuan Hu    XSDecode(src1, src2, SrcType.X, FuType.vsetiwf, fuOp, selImm, uopSplitType,
1611436b764SZiyue Zhang      xWen = F, fWen = F, vWen = F, mWen = F, xsTrap = F, noSpec = F, blockBack = blockBack, flushPipe = flushPipe).generate()
162912e2179SXuan Hu  }
1637f2b7720SXuan Hu}
1647f2b7720SXuan Hu
165912e2179SXuan Hucase class VLD(src2: BitPat, fuOp: BitPat, strided: Boolean = false, indexed: Boolean = false, ff: Boolean = false,
166c4501a6fSZiyue-Zhang  mask: Boolean = false, whole: Boolean = false, ordered: Boolean = false, uopSplitType: BitPat = UopSplitType.VEC_US_LDST) extends XSDecodeBase {
167912e2179SXuan Hu  def generate() : List[BitPat] = {
168912e2179SXuan Hu    val fu = FuType.vldu
169912e2179SXuan Hu    val src1 = SrcType.xp
170382346a1Szhanglinjuan    val src3 = SrcType.vp
171e2695e90SzhanglyGit    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
172b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = T, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
173912e2179SXuan Hu  }
174912e2179SXuan Hu}
175912e2179SXuan Hu
176912e2179SXuan Hucase class VST(src2: BitPat, fuOp: BitPat, strided: Boolean = false, indexed: Boolean = false,
177c4501a6fSZiyue-Zhang  mask: Boolean = false, whole: Boolean = false, ordered: Boolean = false, uopSplitType: BitPat = UopSplitType.VEC_US_LDST) extends XSDecodeBase {
178912e2179SXuan Hu  def generate() : List[BitPat] = {
179912e2179SXuan Hu    val fu = FuType.vstu
180912e2179SXuan Hu    val src1 = SrcType.xp
181912e2179SXuan Hu    val src3 = SrcType.vp
182e2695e90SzhanglyGit    XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType,
183b65b9ebaSXuan Hu      xWen = F, fWen = F, vWen = F, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate()
184912e2179SXuan Hu  }
1857f2b7720SXuan Hu}
1867f2b7720SXuan Hu
1877f2b7720SXuan Huobject VecDecoder extends DecodeConstants {
188b65b9ebaSXuan Hu  val opivv: Array[(BitPat, XSDecodeBase)] = Array(
189d91483a6Sfdy    VADD_VV         -> OPIVV(FuType.vialuF, VialuFixType.vadd_vv, T, F, F),
190d91483a6Sfdy    VSUB_VV         -> OPIVV(FuType.vialuF, VialuFixType.vsub_vv, T, F, F),
1917f2b7720SXuan Hu
192d91483a6Sfdy    VMINU_VV        -> OPIVV(FuType.vialuF, VialuFixType.vminu_vv, T, F, F),
193d91483a6Sfdy    VMIN_VV         -> OPIVV(FuType.vialuF, VialuFixType.vmin_vv, T, F, F),
194d91483a6Sfdy    VMAXU_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmaxu_vv, T, F, F),
195d91483a6Sfdy    VMAX_VV         -> OPIVV(FuType.vialuF, VialuFixType.vmax_vv, T, F, F),
19658c35d23Shuxuan0307
197d91483a6Sfdy    VAND_VV         -> OPIVV(FuType.vialuF, VialuFixType.vand_vv, T, F, F),
198d91483a6Sfdy    VOR_VV          -> OPIVV(FuType.vialuF, VialuFixType.vor_vv, T, F, F),
199d91483a6Sfdy    VXOR_VV         -> OPIVV(FuType.vialuF, VialuFixType.vxor_vv, T, F, F),
20058c35d23Shuxuan0307
201e2695e90SzhanglyGit    VRGATHER_VV     -> OPIVV(FuType.vppu, VpermType.vrgather, T, F, F, UopSplitType.VEC_RGATHER),
202e2695e90SzhanglyGit    VRGATHEREI16_VV -> OPIVV(FuType.vppu, VpermType.vrgatherei16, T, F, F, UopSplitType.VEC_RGATHEREI16),
20358c35d23Shuxuan0307
204d91483a6Sfdy    VADC_VVM        -> OPIVV(FuType.vialuF, VialuFixType.vadc_vvm, T, F, F),
205e2695e90SzhanglyGit    VMADC_VVM       -> OPIVV(FuType.vialuF, VialuFixType.vmadc_vvm, F, T, F, UopSplitType.VEC_VVM),
206e2695e90SzhanglyGit    VMADC_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmadc_vv, F, T, F, UopSplitType.VEC_VVM),
20758c35d23Shuxuan0307
208d91483a6Sfdy    VSBC_VVM        -> OPIVV(FuType.vialuF, VialuFixType.vsbc_vvm, T, F, F),
209e2695e90SzhanglyGit    VMSBC_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmsbc_vv, F, T, F, UopSplitType.VEC_VVM),
210e2695e90SzhanglyGit    VMSBC_VVM       -> OPIVV(FuType.vialuF, VialuFixType.vmsbc_vvm, F, T, F, UopSplitType.VEC_VVM),
21158c35d23Shuxuan0307
212d91483a6Sfdy    VMERGE_VVM      -> OPIVV(FuType.vialuF, VialuFixType.vmerge_vvm, T, F, F),
21358c35d23Shuxuan0307
21472d67441SXuan Hu    VMV_V_V         -> OPIVV(FuType.vialuF, VialuFixType.vmv_v_v, T, F, F, src2 = SrcType.no), // vd[i] = vs1[i], vs2=v0
21558c35d23Shuxuan0307
216e2695e90SzhanglyGit    VMSEQ_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmseq_vv, F, T, F, UopSplitType.VEC_VVM),
217e2695e90SzhanglyGit    VMSNE_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmsne_vv, F, T, F, UopSplitType.VEC_VVM),
218e2695e90SzhanglyGit    VMSLTU_VV       -> OPIVV(FuType.vialuF, VialuFixType.vmsltu_vv, F, T, F, UopSplitType.VEC_VVM),
219e2695e90SzhanglyGit    VMSLT_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmslt_vv, F, T, F, UopSplitType.VEC_VVM),
220e2695e90SzhanglyGit    VMSLEU_VV       -> OPIVV(FuType.vialuF, VialuFixType.vmsleu_vv, F, T, F, UopSplitType.VEC_VVM),
221e2695e90SzhanglyGit    VMSLE_VV        -> OPIVV(FuType.vialuF, VialuFixType.vmsle_vv, F, T, F, UopSplitType.VEC_VVM),
22258c35d23Shuxuan0307
223d91483a6Sfdy    VSLL_VV         -> OPIVV(FuType.vialuF, VialuFixType.vsll_vv, T, F, F),
224d91483a6Sfdy    VSRL_VV         -> OPIVV(FuType.vialuF, VialuFixType.vsrl_vv, T, F, F),
225d91483a6Sfdy    VSRA_VV         -> OPIVV(FuType.vialuF, VialuFixType.vsra_vv, T, F, F),
226e2695e90SzhanglyGit    VNSRL_WV        -> OPIVV(FuType.vialuF, VialuFixType.vnsrl_wv, T, F, F, UopSplitType.VEC_WVV),
227e2695e90SzhanglyGit    VNSRA_WV        -> OPIVV(FuType.vialuF, VialuFixType.vnsra_wv, T, F, F, UopSplitType.VEC_WVV),
22858c35d23Shuxuan0307
229d91483a6Sfdy    VSADDU_VV       -> OPIVV(FuType.vialuF, VialuFixType.vsaddu_vv, T, F, T),
230d91483a6Sfdy    VSADD_VV        -> OPIVV(FuType.vialuF, VialuFixType.vsadd_vv, T, F, T),
231d91483a6Sfdy    VSSUBU_VV       -> OPIVV(FuType.vialuF, VialuFixType.vssubu_vv, T, F, T),
232d91483a6Sfdy    VSSUB_VV        -> OPIVV(FuType.vialuF, VialuFixType.vssub_vv, T, F, T),
23358c35d23Shuxuan0307
234d6059658SZiyue Zhang    VSMUL_VV        -> OPIVV(FuType.vimac, VimacType.vsmul, T, F, T),
23558c35d23Shuxuan0307
236d91483a6Sfdy    VSSRL_VV        -> OPIVV(FuType.vialuF, VialuFixType.vssrl_vv, T, F, F),
237d91483a6Sfdy    VSSRA_VV        -> OPIVV(FuType.vialuF, VialuFixType.vssra_vv, T, F, F),
23858c35d23Shuxuan0307
239e2695e90SzhanglyGit    VNCLIPU_WV      -> OPIVV(FuType.vialuF, VialuFixType.vnclipu_wv, T, F, T, UopSplitType.VEC_WVV),
240e2695e90SzhanglyGit    VNCLIP_WV       -> OPIVV(FuType.vialuF, VialuFixType.vnclip_wv, T, F, T, UopSplitType.VEC_WVV),
241d91483a6Sfdy
242e2695e90SzhanglyGit    VWREDSUMU_VS    -> OPIVV(FuType.vipu, VipuType.vwredsumu_vs, T, F, F, UopSplitType.VEC_VWW),
243e2695e90SzhanglyGit    VWREDSUM_VS     -> OPIVV(FuType.vipu, VipuType.vwredsum_vs, T, F, F, UopSplitType.VEC_VWW),
2447e30d16cSZhaoyang You
2457e30d16cSZhaoyang You    // Zvbb
2467e30d16cSZhaoyang You    VANDN_VV        -> OPIVV(FuType.vialuF, VialuFixType.vandn_vv, T, F, F),
2477e30d16cSZhaoyang You    VROL_VV         -> OPIVV(FuType.vialuF, VialuFixType.vrol_vv, T, F, F, UopSplitType.VEC_VVV),
2487e30d16cSZhaoyang You    VROR_VV         -> OPIVV(FuType.vialuF, VialuFixType.vror_vv, T, F, F, UopSplitType.VEC_VVV),
2497e30d16cSZhaoyang You    VWSLL_VV        -> OPIVV(FuType.vialuF, VialuFixType.vwsll_vv, T, F, F, UopSplitType.VEC_VVW),
2507f2b7720SXuan Hu  )
2517f2b7720SXuan Hu
252b65b9ebaSXuan Hu  val opivx: Array[(BitPat, XSDecodeBase)] = Array(
253d91483a6Sfdy    VADD_VX       -> OPIVX(FuType.vialuF, VialuFixType.vadd_vv, T, F, F),
254d91483a6Sfdy    VSUB_VX       -> OPIVX(FuType.vialuF, VialuFixType.vsub_vv, T, F, F),
255d91483a6Sfdy    VRSUB_VX      -> OPIVX(FuType.vialuF, VialuFixType.vrsub_vv, T, F, F),
25658c35d23Shuxuan0307
257d91483a6Sfdy    VMINU_VX      -> OPIVX(FuType.vialuF, VialuFixType.vminu_vv, T, F, F),
258d91483a6Sfdy    VMIN_VX       -> OPIVX(FuType.vialuF, VialuFixType.vmin_vv, T, F, F),
259d91483a6Sfdy    VMAXU_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmaxu_vv, T, F, F),
260d91483a6Sfdy    VMAX_VX       -> OPIVX(FuType.vialuF, VialuFixType.vmax_vv, T, F, F),
26158c35d23Shuxuan0307
262d91483a6Sfdy    VAND_VX       -> OPIVX(FuType.vialuF, VialuFixType.vand_vv, T, F, F),
263d91483a6Sfdy    VOR_VX        -> OPIVX(FuType.vialuF, VialuFixType.vor_vv, T, F, F),
264d91483a6Sfdy    VXOR_VX       -> OPIVX(FuType.vialuF, VialuFixType.vxor_vv, T, F, F),
26558c35d23Shuxuan0307
266e2695e90SzhanglyGit    VRGATHER_VX   -> OPIVX(FuType.vppu, VpermType.vrgather_vx, T, F, F, UopSplitType.VEC_RGATHER_VX),
26758c35d23Shuxuan0307
268e2695e90SzhanglyGit    VSLIDEUP_VX   -> OPIVX(FuType.vppu, VpermType.vslideup, T, F, F, UopSplitType.VEC_SLIDEUP),
269e2695e90SzhanglyGit    VSLIDEDOWN_VX -> OPIVX(FuType.vppu, VpermType.vslidedown, T, F, F, UopSplitType.VEC_SLIDEDOWN),
27058c35d23Shuxuan0307
271d91483a6Sfdy    VADC_VXM      -> OPIVX(FuType.vialuF, VialuFixType.vadc_vvm, T, F, F),
272e2695e90SzhanglyGit    VMADC_VXM      -> OPIVX(FuType.vialuF, VialuFixType.vmadc_vvm, F, T, F, UopSplitType.VEC_VXM),
273e2695e90SzhanglyGit    VMADC_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmadc_vv, F, T, F, UopSplitType.VEC_VXM),
274d91483a6Sfdy    VSBC_VXM      -> OPIVX(FuType.vialuF, VialuFixType.vsbc_vvm, T, F, F),
275e2695e90SzhanglyGit    VMSBC_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmsbc_vv, F, T, F, UopSplitType.VEC_VXM),
276e2695e90SzhanglyGit    VMSBC_VXM     -> OPIVX(FuType.vialuF, VialuFixType.vmsbc_vvm, F, T, F, UopSplitType.VEC_VXM),
27758c35d23Shuxuan0307
278d91483a6Sfdy    VMERGE_VXM    -> OPIVX(FuType.vialuF, VialuFixType.vmerge_vvm, T, F, F),
27958c35d23Shuxuan0307
28072d67441SXuan Hu    VMV_V_X    -> OPIVX(FuType.vialuF, VialuFixType.vmv_v_v, T, F, F, src2 = SrcType.no), // vd[i] = x[rs1], vs2 = v0
28158c35d23Shuxuan0307
282e2695e90SzhanglyGit    VMSEQ_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmseq_vv, F, T, F, UopSplitType.VEC_VXM),
283e2695e90SzhanglyGit    VMSNE_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmsne_vv, F, T, F, UopSplitType.VEC_VXM),
284e2695e90SzhanglyGit    VMSLTU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vmsltu_vv, F, T, F, UopSplitType.VEC_VXM),
285e2695e90SzhanglyGit    VMSLT_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmslt_vv, F, T, F, UopSplitType.VEC_VXM),
286e2695e90SzhanglyGit    VMSLEU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vmsleu_vv, F, T, F, UopSplitType.VEC_VXM),
287e2695e90SzhanglyGit    VMSLE_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmsle_vv, F, T, F, UopSplitType.VEC_VXM),
288e2695e90SzhanglyGit    VMSGTU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vmsgtu_vv, F, T, F, UopSplitType.VEC_VXM),
289e2695e90SzhanglyGit    VMSGT_VX      -> OPIVX(FuType.vialuF, VialuFixType.vmsgt_vv, F, T, F, UopSplitType.VEC_VXM),
29058c35d23Shuxuan0307
291d91483a6Sfdy    VSLL_VX       -> OPIVX(FuType.vialuF, VialuFixType.vsll_vv, T, F, F),
292d91483a6Sfdy    VSRL_VX       -> OPIVX(FuType.vialuF, VialuFixType.vsrl_vv, T, F, F),
293d91483a6Sfdy    VSRA_VX       -> OPIVX(FuType.vialuF, VialuFixType.vsra_vv, T, F, F),
294e2695e90SzhanglyGit    VNSRL_WX      -> OPIVX(FuType.vialuF, VialuFixType.vnsrl_wv, T, F, F, UopSplitType.VEC_WXV),
295e2695e90SzhanglyGit    VNSRA_WX      -> OPIVX(FuType.vialuF, VialuFixType.vnsra_wv, T, F, F, UopSplitType.VEC_WXV),
296d91483a6Sfdy
297d91483a6Sfdy    VSADDU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vsaddu_vv, T, F, T),
298d91483a6Sfdy    VSADD_VX      -> OPIVX(FuType.vialuF, VialuFixType.vsadd_vv, T, F, T),
299d91483a6Sfdy    VSSUBU_VX     -> OPIVX(FuType.vialuF, VialuFixType.vssubu_vv, T, F, T),
300d91483a6Sfdy    VSSUB_VX      -> OPIVX(FuType.vialuF, VialuFixType.vssub_vv, T, F, T),
30158c35d23Shuxuan0307
3028fb63ad6SXuan Hu    VSMUL_VX      -> OPIVX(FuType.vimac, VimacType.vsmul, T, F, T, UopSplitType.VEC_VXV),
30358c35d23Shuxuan0307
304d91483a6Sfdy    VSSRL_VX      -> OPIVX(FuType.vialuF, VialuFixType.vssrl_vv, T, F, F),
305d91483a6Sfdy    VSSRA_VX      -> OPIVX(FuType.vialuF, VialuFixType.vssra_vv, T, F, F),
30658c35d23Shuxuan0307
307e2695e90SzhanglyGit    VNCLIPU_WX    -> OPIVX(FuType.vialuF, VialuFixType.vnclipu_wv, T, F, T, UopSplitType.VEC_WXV),
308e2695e90SzhanglyGit    VNCLIP_WX     -> OPIVX(FuType.vialuF, VialuFixType.vnclip_wv, T, F, T, UopSplitType.VEC_WXV),
3097e30d16cSZhaoyang You
3107e30d16cSZhaoyang You    // Zvbb
3117e30d16cSZhaoyang You    VANDN_VX      -> OPIVX(FuType.vialuF, VialuFixType.vandn_vv, T, F, F),
3127e30d16cSZhaoyang You    VROL_VX       -> OPIVX(FuType.vialuF, VialuFixType.vrol_vv,  T, F, F, UopSplitType.VEC_VXV),
3137e30d16cSZhaoyang You    VROR_VX       -> OPIVX(FuType.vialuF, VialuFixType.vror_vv,  T, F, F, UopSplitType.VEC_VXV),
3147e30d16cSZhaoyang You    VWSLL_VX      -> OPIVX(FuType.vialuF, VialuFixType.vwsll_vv, T, F, F, UopSplitType.VEC_VXW),
31558c35d23Shuxuan0307  )
31658c35d23Shuxuan0307
317b65b9ebaSXuan Hu  val opivi: Array[(BitPat, XSDecodeBase)] = Array(
318d91483a6Sfdy    VADD_VI       -> OPIVI(FuType.vialuF, VialuFixType.vadd_vv,   T, F, F),
319d91483a6Sfdy    VRSUB_VI      -> OPIVI(FuType.vialuF, VialuFixType.vrsub_vv, T, F, F),
32058c35d23Shuxuan0307
321d91483a6Sfdy    VAND_VI       -> OPIVI(FuType.vialuF, VialuFixType.vand_vv, T, F, F),
322d91483a6Sfdy    VOR_VI        -> OPIVI(FuType.vialuF, VialuFixType.vor_vv, T, F, F),
323d91483a6Sfdy    VXOR_VI       -> OPIVI(FuType.vialuF, VialuFixType.vxor_vv, T, F, F),
32458c35d23Shuxuan0307
325b1712600SZiyue Zhang    VRGATHER_VI   -> OPIVI(FuType.vppu, VpermType.vrgather_vx, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_RGATHER_VX),
32658c35d23Shuxuan0307
327d6059658SZiyue Zhang    VSLIDEUP_VI   -> OPIVI(FuType.vppu, VpermType.vslideup, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_SLIDEUP),
328d6059658SZiyue Zhang    VSLIDEDOWN_VI -> OPIVI(FuType.vppu, VpermType.vslidedown, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_SLIDEDOWN),
32958c35d23Shuxuan0307
330d91483a6Sfdy    VADC_VIM      -> OPIVI(FuType.vialuF, VialuFixType.vadc_vvm, T, F, F),
331d6059658SZiyue Zhang    VMADC_VIM     -> OPIVI(FuType.vialuF, VialuFixType.vmadc_vvm, T, F, F, uopSplitType = UopSplitType.VEC_VXM),
332d6059658SZiyue Zhang    VMADC_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmadc_vv, T, F, F, uopSplitType = UopSplitType.VEC_VXM),
33358c35d23Shuxuan0307
334d91483a6Sfdy    VMERGE_VIM    -> OPIVI(FuType.vialuF, VialuFixType.vmerge_vvm, T, F, F),
33558c35d23Shuxuan0307
33672d67441SXuan Hu    VMV_V_I       -> OPIVI(FuType.vialuF, VialuFixType.vmv_v_v, T, F, F, src2 = SrcType.no), // vd[i] = imm, vs2 = v0
33758c35d23Shuxuan0307
338d6059658SZiyue Zhang    VMSEQ_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmseq_vv, F, T, F, uopSplitType = UopSplitType.VEC_VXM),
339d6059658SZiyue Zhang    VMSNE_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmsne_vv, F, T, F, uopSplitType = UopSplitType.VEC_VXM),
34071d4d0e5SZiyue Zhang    VMSLEU_VI     -> OPIVI(FuType.vialuF, VialuFixType.vmsleu_vv, F, T, F, selImm = SelImm.IMM_OPIVIS, uopSplitType = UopSplitType.VEC_VXM),
341d6059658SZiyue Zhang    VMSLE_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmsle_vv, F, T, F, uopSplitType = UopSplitType.VEC_VXM),
34271d4d0e5SZiyue Zhang    VMSGTU_VI     -> OPIVI(FuType.vialuF, VialuFixType.vmsgtu_vv, F, T, F, selImm = SelImm.IMM_OPIVIS, uopSplitType = UopSplitType.VEC_VXM),
343d6059658SZiyue Zhang    VMSGT_VI      -> OPIVI(FuType.vialuF, VialuFixType.vmsgt_vv, F, T, F, uopSplitType = UopSplitType.VEC_VXM),
34458c35d23Shuxuan0307
345d91483a6Sfdy    VSLL_VI       -> OPIVI(FuType.vialuF, VialuFixType.vsll_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
346d91483a6Sfdy    VSRL_VI       -> OPIVI(FuType.vialuF, VialuFixType.vsrl_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
347d91483a6Sfdy    VSRA_VI       -> OPIVI(FuType.vialuF, VialuFixType.vsra_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
348d6059658SZiyue Zhang    VNSRL_WI      -> OPIVI(FuType.vialuF, VialuFixType.vnsrl_wv, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WXV),
349d6059658SZiyue Zhang    VNSRA_WI      -> OPIVI(FuType.vialuF, VialuFixType.vnsra_wv, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WXV),
35058c35d23Shuxuan0307
35171d4d0e5SZiyue Zhang    VSADDU_VI     -> OPIVI(FuType.vialuF, VialuFixType.vsaddu_vv, T, F, T, selImm = SelImm.IMM_OPIVIS),
352d91483a6Sfdy    VSADD_VI      -> OPIVI(FuType.vialuF, VialuFixType.vsadd_vv, T, F, T),
35358c35d23Shuxuan0307
354d91483a6Sfdy    VSSRL_VI      -> OPIVI(FuType.vialuF, VialuFixType.vssrl_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
355d91483a6Sfdy    VSSRA_VI      -> OPIVI(FuType.vialuF, VialuFixType.vssra_vv, T, F, F, selImm = SelImm.IMM_OPIVIU),
35658c35d23Shuxuan0307
357d6059658SZiyue Zhang    VNCLIPU_WI    -> OPIVI(FuType.vialuF, VialuFixType.vnclipu_wv, T, F, T, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WXV),
3586266af83SZiyue Zhang    VNCLIP_WI     -> OPIVI(FuType.vialuF, VialuFixType.vnclip_wv, T, F, T, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WXV),
359d91483a6Sfdy
3604c4e2cd8SZiyue Zhang    VMV1R_V       -> OPIVI(FuType.vppu, VpermType.vmv1r, T, F, F, uopSplitType = UopSplitType.VEC_MVNR, src1 = SrcType.no), // vmv1r.v vd, vs2
3614c4e2cd8SZiyue Zhang    VMV2R_V       -> OPIVI(FuType.vppu, VpermType.vmv2r, T, F, F, uopSplitType = UopSplitType.VEC_MVNR, src1 = SrcType.no), // vmv2r.v vd, vs2
3624c4e2cd8SZiyue Zhang    VMV4R_V       -> OPIVI(FuType.vppu, VpermType.vmv4r, T, F, F, uopSplitType = UopSplitType.VEC_MVNR, src1 = SrcType.no), // vmv4r.v vd, vs2
3634c4e2cd8SZiyue Zhang    VMV8R_V       -> OPIVI(FuType.vppu, VpermType.vmv8r, T, F, F, uopSplitType = UopSplitType.VEC_MVNR, src1 = SrcType.no), // vmv8r.v vd, vs2
3647e30d16cSZhaoyang You
3657e30d16cSZhaoyang You    // Zvbb
3667e30d16cSZhaoyang You    VROR_VI       -> OPIVI(FuType.vialuF, VialuFixType.vror_vv, T, F, F, selImm = SelImm.IMM_VRORVI, UopSplitType.VEC_VXV),
3677e30d16cSZhaoyang You    VWSLL_VI      -> OPIVI(FuType.vialuF, VialuFixType.vwsll_vv, T, F, F, selImm = SelImm.IMM_OPIVIU, UopSplitType.VEC_VXW),
36858c35d23Shuxuan0307  )
3697f2b7720SXuan Hu
370b65b9ebaSXuan Hu  val opmvv: Array[(BitPat, XSDecodeBase)] = Array(
371e2695e90SzhanglyGit    VAADD_VV     -> OPMVV(T, FuType.vialuF, VialuFixType.vaadd_vv, F, T, F, UopSplitType.VEC_VVV),
372e2695e90SzhanglyGit    VAADDU_VV    -> OPMVV(T, FuType.vialuF, VialuFixType.vaaddu_vv, F, T, F, UopSplitType.VEC_VVV),
373e2695e90SzhanglyGit    VASUB_VV     -> OPMVV(T, FuType.vialuF, VialuFixType.vasub_vv, F, T, F, UopSplitType.VEC_VVV),
374e2695e90SzhanglyGit    VASUBU_VV    -> OPMVV(T, FuType.vialuF, VialuFixType.vasubu_vv, F, T, F, UopSplitType.VEC_VVV),
375adf68ff3Sczw    VCOMPRESS_VM -> OPMVV(T, FuType.vppu, VpermType.vcompress, F, T, F, UopSplitType.VEC_COMPRESS),
37672d67441SXuan Hu    VCPOP_M      -> OPMVV(T, FuType.vipu, VipuType.vcpop_m, T, F, F, UopSplitType.VEC_M0X, src1 = SrcType.no), // vcpop.m rd, vs2, vm
3770bca6cb3SZiyue Zhang    VDIV_VV      -> OPMVV(T, FuType.vidiv, VidivType.vdiv, F, T, F, UopSplitType.VEC_VVV),
3780bca6cb3SZiyue Zhang    VDIVU_VV     -> OPMVV(T, FuType.vidiv, VidivType.vdivu, F, T, F, UopSplitType.VEC_VVV),
379762f2b39SZiyue Zhang    VFIRST_M     -> OPMVV(T, FuType.vipu, VipuType.vfirst_m, T, F, F, src1 = SrcType.no), // vfirst.m rd, vs2, vm
38072d67441SXuan Hu    VID_V        -> OPMVV(T, FuType.vipu, VipuType.vid_v, F, T, F, UopSplitType.VEC_MVV, src1 = SrcType.no, src2 = SrcType.no), // vid.v vd, vm
38172d67441SXuan Hu    VIOTA_M      -> OPMVV(T, FuType.vipu, VipuType.viota_m, F, T, F, UopSplitType.VEC_MVV, src1 = SrcType.no), // viota.m vd, vs2, vm
382b65b9ebaSXuan Hu
383adf68ff3Sczw    VMACC_VV     -> OPMVV(T, FuType.vimac, VimacType.vmacc, F, T, F, UopSplitType.VEC_VVV),
384adf68ff3Sczw    VMADD_VV     -> OPMVV(T, FuType.vimac, VimacType.vmadd, F, T, F, UopSplitType.VEC_VVV),
385*9cf1e44eSZiyue Zhang    VMAND_MM     -> OPMVV(T, FuType.vialuF, VialuFixType.vmand_mm, F, T, F, UopSplitType.dummy),
386*9cf1e44eSZiyue Zhang    VMANDN_MM    -> OPMVV(T, FuType.vialuF, VialuFixType.vmandn_mm, F, T, F, UopSplitType.dummy),
387*9cf1e44eSZiyue Zhang    VMNAND_MM    -> OPMVV(T, FuType.vialuF, VialuFixType.vmnand_mm, F, T, F, UopSplitType.dummy),
388*9cf1e44eSZiyue Zhang    VMNOR_MM     -> OPMVV(T, FuType.vialuF, VialuFixType.vmnor_mm, F, T, F, UopSplitType.dummy),
389*9cf1e44eSZiyue Zhang    VMOR_MM      -> OPMVV(T, FuType.vialuF, VialuFixType.vmor_mm, F, T, F, UopSplitType.dummy),
390*9cf1e44eSZiyue Zhang    VMORN_MM     -> OPMVV(T, FuType.vialuF, VialuFixType.vmorn_mm, F, T, F, UopSplitType.dummy),
391*9cf1e44eSZiyue Zhang    VMXNOR_MM    -> OPMVV(T, FuType.vialuF, VialuFixType.vmxnor_mm, F, T, F, UopSplitType.dummy),
392*9cf1e44eSZiyue Zhang    VMXOR_MM     -> OPMVV(T, FuType.vialuF, VialuFixType.vmxor_mm, F, T, F, UopSplitType.dummy),
393*9cf1e44eSZiyue Zhang    VMSBF_M      -> OPMVV(T, FuType.vipu, VipuType.vmsbf_m, F, T, F, UopSplitType.dummy, src1 = SrcType.no), // vmsbf.m vd, vs2, vm
394*9cf1e44eSZiyue Zhang    VMSIF_M      -> OPMVV(T, FuType.vipu, VipuType.vmsif_m, F, T, F, UopSplitType.dummy, src1 = SrcType.no), // vmsif.m vd, vs2, vm
395*9cf1e44eSZiyue Zhang    VMSOF_M      -> OPMVV(T, FuType.vipu, VipuType.vmsof_m, F, T, F, UopSplitType.dummy, src1 = SrcType.no), // vmsof.m vd, vs2, vm
396adf68ff3Sczw    VMUL_VV      -> OPMVV(T, FuType.vimac, VimacType.vmul, F, T, F, UopSplitType.VEC_VVV),
397adf68ff3Sczw    VMULH_VV     -> OPMVV(T, FuType.vimac, VimacType.vmulh, F, T, F, UopSplitType.VEC_VVV),
398adf68ff3Sczw    VMULHSU_VV   -> OPMVV(T, FuType.vimac, VimacType.vmulhsu, F, T, F, UopSplitType.VEC_VVV),
399adf68ff3Sczw    VMULHU_VV    -> OPMVV(T, FuType.vimac, VimacType.vmulhu, F, T, F, UopSplitType.VEC_VVV),
400b65b9ebaSXuan Hu
401daae8f22SZiyue Zhang    VMV_X_S      -> OPMVV(T, FuType.vipu, VipuType.vmv_x_s, T, F, F, src1 = SrcType.no), // vmv.x.s rd, vs2 # x[rd] = vs2[0]
402adf68ff3Sczw    VNMSAC_VV    -> OPMVV(T, FuType.vimac, VimacType.vnmsac, F, T, F, UopSplitType.VEC_VVV),
403adf68ff3Sczw    VNMSUB_VV    -> OPMVV(T, FuType.vimac, VimacType.vnmsub, F, T, F, UopSplitType.VEC_VVV),
404e2695e90SzhanglyGit    VREDAND_VS   -> OPMVV(T, FuType.vipu, VipuType.vredand_vs, F, T, F, UopSplitType.VEC_VRED),
405e2695e90SzhanglyGit    VREDMAX_VS   -> OPMVV(T, FuType.vipu, VipuType.vredmax_vs, F, T, F, UopSplitType.VEC_VRED),
406e2695e90SzhanglyGit    VREDMAXU_VS  -> OPMVV(T, FuType.vipu, VipuType.vredmaxu_vs, F, T, F, UopSplitType.VEC_VRED),
407e2695e90SzhanglyGit    VREDMIN_VS   -> OPMVV(T, FuType.vipu, VipuType.vredmin_vs, F, T, F, UopSplitType.VEC_VRED),
408e2695e90SzhanglyGit    VREDMINU_VS  -> OPMVV(T, FuType.vipu, VipuType.vredminu_vs, F, T, F, UopSplitType.VEC_VRED),
409e2695e90SzhanglyGit    VREDOR_VS    -> OPMVV(T, FuType.vipu, VipuType.vredor_vs, F, T, F, UopSplitType.VEC_VRED),
410e2695e90SzhanglyGit    VREDSUM_VS   -> OPMVV(T, FuType.vipu, VipuType.vredsum_vs, F, T, F, UopSplitType.VEC_VRED),
411e2695e90SzhanglyGit    VREDXOR_VS   -> OPMVV(T, FuType.vipu, VipuType.vredxor_vs, F, T, F, UopSplitType.VEC_VRED),
4120bca6cb3SZiyue Zhang    VREM_VV      -> OPMVV(T, FuType.vidiv, VidivType.vrem, F, T, F, UopSplitType.VEC_VVV),
4130bca6cb3SZiyue Zhang    VREMU_VV     -> OPMVV(T, FuType.vidiv, VidivType.vremu, F, T, F, UopSplitType.VEC_VVV),
41472d67441SXuan Hu    VSEXT_VF2    -> OPMVV(T, FuType.vialuF, VialuFixType.vsext_vf2, F, T, F, UopSplitType.VEC_EXT2, src1 = SrcType.no), // vsext.vf2 vd, vs2, vm
41572d67441SXuan Hu    VSEXT_VF4    -> OPMVV(T, FuType.vialuF, VialuFixType.vsext_vf4, F, T, F, UopSplitType.VEC_EXT4, src1 = SrcType.no), // vsext.vf4 vd, vs2, vm
41672d67441SXuan Hu    VSEXT_VF8    -> OPMVV(T, FuType.vialuF, VialuFixType.vsext_vf8, F, T, F, UopSplitType.VEC_EXT8, src1 = SrcType.no), // vsext.vf8 vd, vs2, vm
41772d67441SXuan Hu    VZEXT_VF2    -> OPMVV(T, FuType.vialuF, VialuFixType.vzext_vf2, F, T, F, UopSplitType.VEC_EXT2, src1 = SrcType.no), // vzext.vf2 vd, vs2, vm
41872d67441SXuan Hu    VZEXT_VF4    -> OPMVV(T, FuType.vialuF, VialuFixType.vzext_vf4, F, T, F, UopSplitType.VEC_EXT4, src1 = SrcType.no), // vzext.vf4 vd, vs2, vm
41972d67441SXuan Hu    VZEXT_VF8    -> OPMVV(T, FuType.vialuF, VialuFixType.vzext_vf8, F, T, F, UopSplitType.VEC_EXT8, src1 = SrcType.no), // vzext.vf8 vd, vs2, vm
420e2695e90SzhanglyGit    VWADD_VV     -> OPMVV(T, FuType.vialuF, VialuFixType.vwadd_vv, F, T, F, UopSplitType.VEC_VVW),
421e2695e90SzhanglyGit    VWADD_WV     -> OPMVV(T, FuType.vialuF, VialuFixType.vwadd_wv, F, T, F, UopSplitType.VEC_WVW),
422e2695e90SzhanglyGit    VWADDU_VV    -> OPMVV(T, FuType.vialuF, VialuFixType.vwaddu_vv, F, T, F, UopSplitType.VEC_VVW),
423e2695e90SzhanglyGit    VWADDU_WV    -> OPMVV(T, FuType.vialuF, VialuFixType.vwaddu_wv, F, T, F, UopSplitType.VEC_WVW),
424adf68ff3Sczw    VWMACC_VV    -> OPMVV(T, FuType.vimac, VimacType.vwmacc, F, T, F, UopSplitType.VEC_VVW),
425adf68ff3Sczw    VWMACCSU_VV  -> OPMVV(T, FuType.vimac, VimacType.vwmaccsu, F, T, F, UopSplitType.VEC_VVW),
426adf68ff3Sczw    VWMACCU_VV   -> OPMVV(T, FuType.vimac, VimacType.vwmaccu, F, T, F, UopSplitType.VEC_VVW),
427adf68ff3Sczw    VWMUL_VV     -> OPMVV(T, FuType.vimac, VimacType.vwmul, F, T, F, UopSplitType.VEC_VVW),
428adf68ff3Sczw    VWMULSU_VV   -> OPMVV(T, FuType.vimac, VimacType.vwmulsu, F, T, F, UopSplitType.VEC_VVW),
429adf68ff3Sczw    VWMULU_VV    -> OPMVV(T, FuType.vimac, VimacType.vwmulu, F, T, F, UopSplitType.VEC_VVW),
430e2695e90SzhanglyGit    VWSUB_VV     -> OPMVV(T, FuType.vialuF, VialuFixType.vwsub_vv, F, T, F, UopSplitType.VEC_VVW),
431e2695e90SzhanglyGit    VWSUB_WV     -> OPMVV(T, FuType.vialuF, VialuFixType.vwsub_wv, F, T, F, UopSplitType.VEC_WVW),
432e2695e90SzhanglyGit    VWSUBU_VV    -> OPMVV(T, FuType.vialuF, VialuFixType.vwsubu_vv, F, T, F, UopSplitType.VEC_VVW),
433e2695e90SzhanglyGit    VWSUBU_WV    -> OPMVV(T, FuType.vialuF, VialuFixType.vwsubu_wv, F, T, F, UopSplitType.VEC_WVW),
4347e30d16cSZhaoyang You
4357e30d16cSZhaoyang You    // Zvbb
4367e30d16cSZhaoyang You    VBREV_V      -> OPMVV(T, FuType.vialuF, VialuFixType.vbrev_v,  F, T, F, UopSplitType.VEC_VVV, src1 = SrcType.no),
4377e30d16cSZhaoyang You    VBREV8_V     -> OPMVV(T, FuType.vialuF, VialuFixType.vbrev8_v, F, T, F, UopSplitType.VEC_VVV, src1 = SrcType.no),
4387e30d16cSZhaoyang You    VREV8_V      -> OPMVV(T, FuType.vialuF, VialuFixType.vrev8_v,  F, T, F, UopSplitType.VEC_VVV, src1 = SrcType.no),
4397e30d16cSZhaoyang You    VCLZ_V       -> OPMVV(T, FuType.vialuF, VialuFixType.vclz_v,   F, T, F, UopSplitType.VEC_VVV, src1 = SrcType.no),
4407e30d16cSZhaoyang You    VCTZ_V       -> OPMVV(T, FuType.vialuF, VialuFixType.vctz_v,   F, T, F, UopSplitType.VEC_VVV, src1 = SrcType.no),
4417e30d16cSZhaoyang You    VCPOP_V      -> OPMVV(T, FuType.vialuF, VialuFixType.vcpop_v,  F, T, F, UopSplitType.VEC_VVV, src1 = SrcType.no),
442c6661c33SHaojin Tang  )
443912e2179SXuan Hu
444b65b9ebaSXuan Hu  val opmvx: Array[(BitPat, XSDecodeBase)] = Array(
445e2695e90SzhanglyGit    VAADD_VX       -> OPMVX(T, FuType.vialuF, VialuFixType.vaadd_vv, F, T, F, UopSplitType.VEC_VXV),
446e2695e90SzhanglyGit    VAADDU_VX      -> OPMVX(T, FuType.vialuF, VialuFixType.vaaddu_vv, F, T, F, UopSplitType.VEC_VXV),
447e2695e90SzhanglyGit    VASUB_VX       -> OPMVX(T, FuType.vialuF, VialuFixType.vasub_vv, F, T, F, UopSplitType.VEC_VXV),
448e2695e90SzhanglyGit    VASUBU_VX      -> OPMVX(T, FuType.vialuF, VialuFixType.vasubu_vv, F, T, F, UopSplitType.VEC_VXV),
4490bca6cb3SZiyue Zhang    VDIV_VX        -> OPMVX(T, FuType.vidiv, VidivType.vdiv, F, T, F, UopSplitType.VEC_VXV),
4500bca6cb3SZiyue Zhang    VDIVU_VX       -> OPMVX(T, FuType.vidiv, VidivType.vdivu, F, T, F, UopSplitType.VEC_VXV),
451adf68ff3Sczw    VMACC_VX       -> OPMVX(T, FuType.vimac, VimacType.vmacc, F, T, F, UopSplitType.VEC_VXV),
452adf68ff3Sczw    VMADD_VX       -> OPMVX(T, FuType.vimac, VimacType.vmadd, F, T, F, UopSplitType.VEC_VXV),
453adf68ff3Sczw    VMUL_VX        -> OPMVX(T, FuType.vimac, VimacType.vmul, F, T, F, UopSplitType.VEC_VXV),
454adf68ff3Sczw    VMULH_VX       -> OPMVX(T, FuType.vimac, VimacType.vmulh, F, T, F, UopSplitType.VEC_VXV),
455adf68ff3Sczw    VMULHSU_VX     -> OPMVX(T, FuType.vimac, VimacType.vmulhsu, F, T, F, UopSplitType.VEC_VXV),
456adf68ff3Sczw    VMULHU_VX      -> OPMVX(T, FuType.vimac, VimacType.vmulhu, F, T, F, UopSplitType.VEC_VXV),
4577c67deccSZiyue Zhang    VMV_S_X        -> OPMVX(T, FuType.vialuF, VialuFixType.vmv_s_x, F, T, F, UopSplitType.VEC_0XV, src2 = SrcType.no), // vmv.s.x vd, rs1 # vd[0] = x[rs1] (vs2=0)
458b65b9ebaSXuan Hu
459adf68ff3Sczw    VNMSAC_VX      -> OPMVX(T, FuType.vimac, VimacType.vnmsac, F, T, F, UopSplitType.VEC_VXV),
460adf68ff3Sczw    VNMSUB_VX      -> OPMVX(T, FuType.vimac, VimacType.vnmsub, F, T, F, UopSplitType.VEC_VXV),
4610bca6cb3SZiyue Zhang    VREM_VX        -> OPMVX(T, FuType.vidiv, VidivType.vrem, F, T, F, UopSplitType.VEC_VXV),
4620bca6cb3SZiyue Zhang    VREMU_VX       -> OPMVX(T, FuType.vidiv, VidivType.vremu, F, T, F, UopSplitType.VEC_VXV),
463b65b9ebaSXuan Hu
464e2695e90SzhanglyGit    VSLIDE1DOWN_VX -> OPMVX(T, FuType.vppu, VpermType.vslide1down, F, T, F, UopSplitType.VEC_SLIDE1DOWN),
465e2695e90SzhanglyGit    VSLIDE1UP_VX   -> OPMVX(T, FuType.vppu, VpermType.vslide1up, F, T, F, UopSplitType.VEC_SLIDE1UP),
466e2695e90SzhanglyGit    VWADD_VX       -> OPMVX(T, FuType.vialuF, VialuFixType.vwadd_vv, F, T, F, UopSplitType.VEC_VXW),
467e2695e90SzhanglyGit    VWADD_WX       -> OPMVX(T, FuType.vialuF, VialuFixType.vwadd_wv, F, T, F, UopSplitType.VEC_WXW),
468e2695e90SzhanglyGit    VWADDU_VX      -> OPMVX(T, FuType.vialuF, VialuFixType.vwaddu_vv, F, T, F, UopSplitType.VEC_VXW),
469e2695e90SzhanglyGit    VWADDU_WX      -> OPMVX(T, FuType.vialuF, VialuFixType.vwaddu_wv, F, T, F, UopSplitType.VEC_WXW),
470b65b9ebaSXuan Hu
471b65b9ebaSXuan Hu    // OutOfMemoryError
472adf68ff3Sczw    VWMACC_VX      -> OPMVX(T, FuType.vimac, VimacType.vwmacc, F, T, F, UopSplitType.VEC_VXW),
473adf68ff3Sczw    VWMACCSU_VX    -> OPMVX(T, FuType.vimac, VimacType.vwmaccsu, F, T, F, UopSplitType.VEC_VXW),
474adf68ff3Sczw    VWMACCU_VX     -> OPMVX(T, FuType.vimac, VimacType.vwmaccu, F, T, F, UopSplitType.VEC_VXW),
475b65b9ebaSXuan Hu
476adf68ff3Sczw    VWMACCUS_VX    -> OPMVX(T, FuType.vimac, VimacType.vwmaccus, F, T, F, UopSplitType.VEC_VXW),
477adf68ff3Sczw    VWMUL_VX       -> OPMVX(T, FuType.vimac, VimacType.vwmul, F, T, F, UopSplitType.VEC_VXW),
478adf68ff3Sczw    VWMULSU_VX     -> OPMVX(T, FuType.vimac, VimacType.vwmulsu, F, T, F, UopSplitType.VEC_VXW),
479b65b9ebaSXuan Hu    // Ok
480adf68ff3Sczw    VWMULU_VX      -> OPMVX(T, FuType.vimac, VimacType.vwmulu, F, T, F, UopSplitType.VEC_VXW),
481e2695e90SzhanglyGit    VWSUB_VX       -> OPMVX(T, FuType.vialuF, VialuFixType.vwsub_vv, F, T, F, UopSplitType.VEC_VXW),
482e2695e90SzhanglyGit    VWSUB_WX       -> OPMVX(T, FuType.vialuF, VialuFixType.vwsub_wv, F, T, F, UopSplitType.VEC_WXW),
483e2695e90SzhanglyGit    VWSUBU_VX      -> OPMVX(T, FuType.vialuF, VialuFixType.vwsubu_vv, F, T, F, UopSplitType.VEC_VXW),
484e2695e90SzhanglyGit    VWSUBU_WX      -> OPMVX(T, FuType.vialuF, VialuFixType.vwsubu_wv, F, T, F, UopSplitType.VEC_WXW),
485c6661c33SHaojin Tang  )
4867f2b7720SXuan Hu
487bdda74fdSxiaofeibao-xjtu  val opfff: Array[(BitPat, XSDecodeBase)] = Array(
488bdda74fdSxiaofeibao-xjtu    // Scalar Float Point
4894b136a73Ssinsanction    FADD_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfadd, F, T, F, UopSplitType.SCA_SIM),
4904b136a73Ssinsanction    FADD_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfadd, F, T, F, UopSplitType.SCA_SIM),
491614d2bc6SHeiHuDie    FADD_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfadd, F, T, F, UopSplitType.SCA_SIM),
4924b136a73Ssinsanction    FSUB_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsub, F, T, F, UopSplitType.SCA_SIM),
4934b136a73Ssinsanction    FSUB_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsub, F, T, F, UopSplitType.SCA_SIM),
494614d2bc6SHeiHuDie    FSUB_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsub, F, T, F, UopSplitType.SCA_SIM),
4954b136a73Ssinsanction    FEQ_S  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfeq , T, F, F, UopSplitType.SCA_SIM),
4964b136a73Ssinsanction    FLT_S  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vflt , T, F, F, UopSplitType.SCA_SIM),
4974b136a73Ssinsanction    FLE_S  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfle , T, F, F, UopSplitType.SCA_SIM),
4984b136a73Ssinsanction    FEQ_D  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfeq , T, F, F, UopSplitType.SCA_SIM),
4994b136a73Ssinsanction    FLT_D  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vflt , T, F, F, UopSplitType.SCA_SIM),
5004b136a73Ssinsanction    FLE_D  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfle , T, F, F, UopSplitType.SCA_SIM),
501614d2bc6SHeiHuDie    FEQ_H  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfeq , T, F, F, UopSplitType.SCA_SIM),
502614d2bc6SHeiHuDie    FLT_H  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vflt , T, F, F, UopSplitType.SCA_SIM),
503614d2bc6SHeiHuDie    FLE_H  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfle , T, F, F, UopSplitType.SCA_SIM),
5044b136a73Ssinsanction    FMIN_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfmin, F, T, F, UopSplitType.SCA_SIM),
5054b136a73Ssinsanction    FMIN_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfmin, F, T, F, UopSplitType.SCA_SIM),
5064b136a73Ssinsanction    FMAX_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfmax, F, T, F, UopSplitType.SCA_SIM),
5074b136a73Ssinsanction    FMAX_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfmax, F, T, F, UopSplitType.SCA_SIM),
508614d2bc6SHeiHuDie    FMIN_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfmin, F, T, F, UopSplitType.SCA_SIM),
509614d2bc6SHeiHuDie    FMAX_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfmax, F, T, F, UopSplitType.SCA_SIM),
510572278faSZiyue Zhang    // Scalar Float Point Convert Inst.
5114b136a73Ssinsanction    FCVT_W_S  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfcvt_xfv,   T, F, F, UopSplitType.SCA_SIM),
5124b136a73Ssinsanction    FCVT_WU_S -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfcvt_xufv,  T, F, F, UopSplitType.SCA_SIM),
5134b136a73Ssinsanction    FCVT_L_S  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfwcvt_xfv,  T, F, F, UopSplitType.SCA_SIM),
5144b136a73Ssinsanction    FCVT_LU_S -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfwcvt_xufv, T, F, F, UopSplitType.SCA_SIM),
5154b136a73Ssinsanction    FCVT_W_D  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfncvt_xfw,  T, F, F, UopSplitType.SCA_SIM),
5164b136a73Ssinsanction    FCVT_WU_D -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfncvt_xufw, T, F, F, UopSplitType.SCA_SIM),
5174b136a73Ssinsanction    FCVT_L_D  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfcvt_xfv,   T, F, F, UopSplitType.SCA_SIM),
5184b136a73Ssinsanction    FCVT_LU_D -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfcvt_xufv,  T, F, F, UopSplitType.SCA_SIM),
5194b136a73Ssinsanction    FCVT_S_D  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfncvt_ffw,  F, T, F, UopSplitType.SCA_SIM),
5204b136a73Ssinsanction    FCVT_D_S  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.vfwcvt_ffv,  F, T, F, UopSplitType.SCA_SIM),
521b189aafaSzmx    //Scala Half-Precision Float Convert Inst.
522b189aafaSzmx    FCVT_H_S  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvt_h_s,  F, T, F, UopSplitType.SCA_SIM),
523b189aafaSzmx    FCVT_S_H  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvt_s_h,  F, T, F, UopSplitType.SCA_SIM),
524b189aafaSzmx    FCVT_H_D  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvt_h_d,  F, T, F, UopSplitType.SCA_SIM),
525b189aafaSzmx    FCVT_D_H  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvt_d_h,  F, T, F, UopSplitType.SCA_SIM),
526614d2bc6SHeiHuDie    FCVT_W_H  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvt_w_h,  T, F, F, UopSplitType.SCA_SIM),
527614d2bc6SHeiHuDie    FCVT_WU_H -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvt_wu_h, T, F, F, UopSplitType.SCA_SIM),
528614d2bc6SHeiHuDie    FCVT_L_H  -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvt_l_h,  T, F, F, UopSplitType.SCA_SIM),
529614d2bc6SHeiHuDie    FCVT_LU_H -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvt_lu_h, T, F, F, UopSplitType.SCA_SIM),
530572278faSZiyue Zhang    // Scalar Float Point f2i MV Inst.
5314b136a73Ssinsanction    FMV_X_D -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, FuOpType.FMVXF, T, F, F, UopSplitType.SCA_SIM),
5324b136a73Ssinsanction    FMV_X_W -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, FuOpType.FMVXF, T, F, F, UopSplitType.SCA_SIM),
533b189aafaSzmx    FMV_X_H -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, FuOpType.FMVXF, T, F, F, UopSplitType.SCA_SIM),
534bdda74fdSxiaofeibao-xjtu    // donot wflags
5354b136a73Ssinsanction    FCLASS_S -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.falu, VfaluType.vfclass, T, F, F, UopSplitType.SCA_SIM),
5364b136a73Ssinsanction    FCLASS_D -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.falu, VfaluType.vfclass, T, F, F, UopSplitType.SCA_SIM),
537614d2bc6SHeiHuDie    FCLASS_H -> OPFFF(SrcType.fp, SrcType.X, SrcType.X, FuType.falu, VfaluType.vfclass, T, F, F, UopSplitType.SCA_SIM),
5384b136a73Ssinsanction    FSGNJ_S  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsgnj , F, T, F, UopSplitType.SCA_SIM),
5394b136a73Ssinsanction    FSGNJ_D  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsgnj , F, T, F, UopSplitType.SCA_SIM),
540614d2bc6SHeiHuDie    FSGNJ_H  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsgnj , F, T, F, UopSplitType.SCA_SIM),
5414b136a73Ssinsanction    FSGNJX_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsgnjx, F, T, F, UopSplitType.SCA_SIM),
5424b136a73Ssinsanction    FSGNJX_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsgnjx, F, T, F, UopSplitType.SCA_SIM),
543614d2bc6SHeiHuDie    FSGNJX_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsgnjx, F, T, F, UopSplitType.SCA_SIM),
5444b136a73Ssinsanction    FSGNJN_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsgnjn, F, T, F, UopSplitType.SCA_SIM),
5454b136a73Ssinsanction    FSGNJN_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsgnjn, F, T, F, UopSplitType.SCA_SIM),
546614d2bc6SHeiHuDie    FSGNJN_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.vfsgnjn, F, T, F, UopSplitType.SCA_SIM),
547bdda74fdSxiaofeibao-xjtu
5484b136a73Ssinsanction    FMUL_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac , VfmaType.vfmul, F, T, F, UopSplitType.SCA_SIM),
5494b136a73Ssinsanction    FMUL_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac , VfmaType.vfmul, F, T, F, UopSplitType.SCA_SIM),
550614d2bc6SHeiHuDie    FMUL_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac , VfmaType.vfmul, F, T, F, UopSplitType.SCA_SIM),
551bdda74fdSxiaofeibao-xjtu
5524b136a73Ssinsanction    FDIV_S  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, VfdivType.vfdiv , F, T, F, UopSplitType.SCA_SIM),
5534b136a73Ssinsanction    FDIV_D  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, VfdivType.vfdiv , F, T, F, UopSplitType.SCA_SIM),
554614d2bc6SHeiHuDie    FDIV_H  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, VfdivType.vfdiv , F, T, F, UopSplitType.SCA_SIM),
5554b136a73Ssinsanction    FSQRT_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, VfdivType.vfsqrt, F, T, F, UopSplitType.SCA_SIM),
5564b136a73Ssinsanction    FSQRT_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, VfdivType.vfsqrt, F, T, F, UopSplitType.SCA_SIM),
557614d2bc6SHeiHuDie    FSQRT_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, VfdivType.vfsqrt, F, T, F, UopSplitType.SCA_SIM),
558bdda74fdSxiaofeibao-xjtu
5594b136a73Ssinsanction    FMADD_S  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfmacc , F, T, F, UopSplitType.SCA_SIM),
5604b136a73Ssinsanction    FMSUB_S  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfmsac , F, T, F, UopSplitType.SCA_SIM),
5614b136a73Ssinsanction    FNMADD_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfnmacc, F, T, F, UopSplitType.SCA_SIM),
5624b136a73Ssinsanction    FNMSUB_S -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfnmsac, F, T, F, UopSplitType.SCA_SIM),
5634b136a73Ssinsanction    FMADD_D  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfmacc , F, T, F, UopSplitType.SCA_SIM),
5644b136a73Ssinsanction    FMSUB_D  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfmsac , F, T, F, UopSplitType.SCA_SIM),
5654b136a73Ssinsanction    FNMADD_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfnmacc, F, T, F, UopSplitType.SCA_SIM),
5664b136a73Ssinsanction    FNMSUB_D -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfnmsac, F, T, F, UopSplitType.SCA_SIM),
567614d2bc6SHeiHuDie    FMADD_H  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfmacc , F, T, F, UopSplitType.SCA_SIM),
568614d2bc6SHeiHuDie    FMSUB_H  -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfmsac , F, T, F, UopSplitType.SCA_SIM),
569614d2bc6SHeiHuDie    FNMADD_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfnmacc, F, T, F, UopSplitType.SCA_SIM),
570614d2bc6SHeiHuDie    FNMSUB_H -> OPFFF(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, VfmaType.vfnmsac, F, T, F, UopSplitType.SCA_SIM),
571bdda74fdSxiaofeibao-xjtu  )
572bdda74fdSxiaofeibao-xjtu
573b65b9ebaSXuan Hu  val opfvv: Array[(BitPat, XSDecodeBase)] = Array(
574b448988dSczw    // 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions
575cb81ef42Sxiaofeibao-xjtu    VFADD_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.VEC_VVV),
576cb81ef42Sxiaofeibao-xjtu    VFSUB_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsub, F, T, F, UopSplitType.VEC_VVV),
577b448988dSczw
578b448988dSczw    // 13.3. Vector Widening Floating-Point Add/Subtract Instructions
579cb81ef42Sxiaofeibao-xjtu    VFWADD_VV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd  , F, T, F, UopSplitType.VEC_VVW),
580cb81ef42Sxiaofeibao-xjtu    VFWSUB_VV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub  , F, T, F, UopSplitType.VEC_VVW),
581cb81ef42Sxiaofeibao-xjtu    VFWADD_WV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd_w, F, T, F, UopSplitType.VEC_WVW),
582cb81ef42Sxiaofeibao-xjtu    VFWSUB_WV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub_w, F, T, F, UopSplitType.VEC_WVW),
583b448988dSczw
584b448988dSczw    // 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
585cb81ef42Sxiaofeibao-xjtu    VFMUL_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfma, VfmaType.vfmul, F, T, F, UopSplitType.VEC_VVV),
586cb81ef42Sxiaofeibao-xjtu    VFDIV_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfdiv, VfdivType.vfdiv , F, T, F, UopSplitType.VEC_VVV),
587b448988dSczw
588b448988dSczw    // 13.5. Vector Widening Floating-Point Multiply
589cb81ef42Sxiaofeibao-xjtu    VFWMUL_VV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfma, VfmaType.vfmul_w, F, T, F, UopSplitType.VEC_VVW),
590b448988dSczw
591b448988dSczw    // 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions
592b19366b2Sxiaofeibao-xjtu    VFMACC_VV          -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.VEC_VVV),
593b19366b2Sxiaofeibao-xjtu    VFNMACC_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.VEC_VVV),
594b19366b2Sxiaofeibao-xjtu    VFMSAC_VV          -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.VEC_VVV),
595b19366b2Sxiaofeibao-xjtu    VFNMSAC_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.VEC_VVV),
596b19366b2Sxiaofeibao-xjtu    VFMADD_VV          -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmadd , F, T, F, UopSplitType.VEC_VVV),
597b19366b2Sxiaofeibao-xjtu    VFNMADD_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmadd, F, T, F, UopSplitType.VEC_VVV),
598b19366b2Sxiaofeibao-xjtu    VFMSUB_VV          -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmsub , F, T, F, UopSplitType.VEC_VVV),
599b19366b2Sxiaofeibao-xjtu    VFNMSUB_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmsub, F, T, F, UopSplitType.VEC_VVV),
600b448988dSczw
601b448988dSczw    // 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions
602b19366b2Sxiaofeibao-xjtu    VFWMACC_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmacc_w , F, T, F, UopSplitType.VEC_VVW),
603b19366b2Sxiaofeibao-xjtu    VFWNMACC_VV        -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc_w, F, T, F, UopSplitType.VEC_VVW),
604b19366b2Sxiaofeibao-xjtu    VFWMSAC_VV         -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmsac_w , F, T, F, UopSplitType.VEC_VVW),
605b19366b2Sxiaofeibao-xjtu    VFWNMSAC_VV        -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac_w, F, T, F, UopSplitType.VEC_VVW),
606b448988dSczw
607b448988dSczw    // 13.8. Vector Floating-Point Square-Root Instruction
60872d67441SXuan Hu    VFSQRT_V           -> OPFVV(SrcType.X , SrcType.vp , FuType.vfdiv, VfdivType.vfsqrt, F, T, F, UopSplitType.VEC_VVV), // vfsqrt.v vd, vs2, vm
609b448988dSczw
610ba899681Schengguanghui    // 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction
61172d67441SXuan Hu    VFRSQRT7_V         -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfrsqrt7, F, T, F, UopSplitType.VEC_VVV), // vfrsqrt7.v vd, vs2, vm
612b448988dSczw
613ba899681Schengguanghui    // 13.10. Vector Floating-Point Reciprocal Estimate Instruction
61472d67441SXuan Hu    VFREC7_V           -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfrec7, F, T, F, UopSplitType.VEC_VVV), // vfrec7.v vd, vs2, vm
615b448988dSczw
616b448988dSczw    // 13.11. Vector Floating-Point MIN/MAX Instructions
617cb81ef42Sxiaofeibao-xjtu    VFMIN_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.VEC_VVV),
618cb81ef42Sxiaofeibao-xjtu    VFMAX_VV           -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.VEC_VVV),
619b448988dSczw
620b448988dSczw    // 13.12. Vector Floating-Point Sign-Injection Instructions
621cb81ef42Sxiaofeibao-xjtu    VFSGNJ_VV          -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsgnj , F, T, F, UopSplitType.VEC_VVV),
622cb81ef42Sxiaofeibao-xjtu    VFSGNJN_VV         -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsgnjn, F, T, F, UopSplitType.VEC_VVV),
623cb81ef42Sxiaofeibao-xjtu    VFSGNJX_VV         -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsgnjx, F, T, F, UopSplitType.VEC_VVV),
624b448988dSczw
625b448988dSczw    // 13.13. Vector Floating-Point Compare Instructions
626f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV           -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfeq, F, T, F, UopSplitType.VEC_VVM),
627f06d6d60Sxiaofeibao-xjtu    VMFNE_VV           -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfne, F, T, F, UopSplitType.VEC_VVM),
628f06d6d60Sxiaofeibao-xjtu    VMFLT_VV           -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vflt, F, T, F, UopSplitType.VEC_VVM),
629f06d6d60Sxiaofeibao-xjtu    VMFLE_VV           -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfle, F, T, F, UopSplitType.VEC_VVM),
630b448988dSczw
631b448988dSczw    // 13.14. Vector Floating-Point Classify Instruction
6328df34fe4SZiyue Zhang    VFCLASS_V          -> OPFVV(SrcType.X , SrcType.vp , FuType.vfalu, VfaluType.vfclass, F, T, F, UopSplitType.VEC_VVV),
633b448988dSczw
634ba899681Schengguanghui    // 13.17. Single-Width Floating-Point/Integer Type-Convert Instructions
6359d3cebe7Schengguanghui    VFCVT_XU_F_V       -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfcvt_xufv, F, T, F, UopSplitType.VEC_VVV),
6369d3cebe7Schengguanghui    VFCVT_X_F_V        -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfcvt_xfv, F, T, F, UopSplitType.VEC_VVV),
6379d3cebe7Schengguanghui    VFCVT_RTZ_XU_F_V   -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfcvt_rtz_xufv, F, T, F, UopSplitType.VEC_VVV),
6389d3cebe7Schengguanghui    VFCVT_RTZ_X_F_V    -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfcvt_rtz_xfv, F, T, F, UopSplitType.VEC_VVV),
6399d3cebe7Schengguanghui    VFCVT_F_XU_V       -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfcvt_fxuv, F, T, F, UopSplitType.VEC_VVV),
6409d3cebe7Schengguanghui    VFCVT_F_X_V        -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfcvt_fxv, F, T, F, UopSplitType.VEC_VVV),
641b448988dSczw
642ba899681Schengguanghui    // 13.18. Widening Floating-Point/Integer Type-Convert Instructions
6439d3cebe7Schengguanghui    VFWCVT_XU_F_V      -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfwcvt_xufv, F, T, F, UopSplitType.VEC_VVW),
6449d3cebe7Schengguanghui    VFWCVT_X_F_V       -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfwcvt_xfv, F, T, F, UopSplitType.VEC_VVW),
6459d3cebe7Schengguanghui    VFWCVT_RTZ_XU_F_V  -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfwcvt_rtz_xufv, F, T, F, UopSplitType.VEC_VVW),
6469d3cebe7Schengguanghui    VFWCVT_RTZ_X_F_V   -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfwcvt_rtz_xfv, F, T, F, UopSplitType.VEC_VVW),
6479d3cebe7Schengguanghui    VFWCVT_F_XU_V      -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfwcvt_fxuv, F, T, F, UopSplitType.VEC_VVW),
6489d3cebe7Schengguanghui    VFWCVT_F_X_V       -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfwcvt_fxv, F, T, F, UopSplitType.VEC_VVW),
6499d3cebe7Schengguanghui    VFWCVT_F_F_V       -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfwcvt_ffv, F, T, F, UopSplitType.VEC_VVW),
650b448988dSczw
651b65b9ebaSXuan Hu    // !
652ba899681Schengguanghui    // 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions
653ba899681Schengguanghui    VFNCVT_XU_F_W      -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfncvt_xufw, F, T, F, UopSplitType.VEC_WVV),
654ba899681Schengguanghui    VFNCVT_X_F_W       -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfncvt_xfw, F, T, F, UopSplitType.VEC_WVV),
65517f57ffdSZiyue Zhang    VFNCVT_RTZ_XU_F_W  -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfncvt_rtz_xufw, F, T, F, UopSplitType.VEC_WVV),
656ba899681Schengguanghui    VFNCVT_RTZ_X_F_W   -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfncvt_rtz_xfw, F, T, F, UopSplitType.VEC_WVV),
657ba899681Schengguanghui    VFNCVT_F_XU_W      -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfncvt_fxuw, F, T, F, UopSplitType.VEC_WVV),
658ba899681Schengguanghui    VFNCVT_F_X_W       -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfncvt_fxw, F, T, F, UopSplitType.VEC_WVV),
659ba899681Schengguanghui    VFNCVT_F_F_W       -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfncvt_ffw, F, T, F, UopSplitType.VEC_WVV),
660ba899681Schengguanghui    VFNCVT_ROD_F_F_W   -> OPFVV(SrcType.X , SrcType.vp , FuType.vfcvt, VfcvtType.vfncvt_rod_ffw, F, T, F, UopSplitType.VEC_WVV),
661b448988dSczw    // 14.3. Vector Single-Width Floating-Point Reduction Instructions
662cb81ef42Sxiaofeibao-xjtu    VFREDOSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredosum, F, T, F, UopSplitType.VEC_VFREDOSUM),
663cb81ef42Sxiaofeibao-xjtu    VFREDUSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredusum, F, T, F, UopSplitType.VEC_VFRED),
664cb81ef42Sxiaofeibao-xjtu    VFREDMAX_VS  -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredmax , F, T, F, UopSplitType.VEC_VFRED),
665cb81ef42Sxiaofeibao-xjtu    VFREDMIN_VS  -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredmin , F, T, F, UopSplitType.VEC_VFRED),
666b448988dSczw
667b448988dSczw    // 14.4. Vector Widening Floating-Point Reduction Instructions
668cb81ef42Sxiaofeibao-xjtu    VFWREDOSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfwredosum, F, T, F, UopSplitType.VEC_VFREDOSUM),
6692ec38117SZiyue Zhang    VFWREDUSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfwredosum, F, T, F, UopSplitType.VEC_VFREDOSUM),
670b448988dSczw
671b448988dSczw  )
6727f2b7720SXuan Hu
673b65b9ebaSXuan Hu  val opfvf: Array[(BitPat, XSDecodeBase)] = Array(
674b448988dSczw    // 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions
675cb81ef42Sxiaofeibao-xjtu    VFADD_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.VEC_VFV),
676cb81ef42Sxiaofeibao-xjtu    VFSUB_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsub , F, T, F, UopSplitType.VEC_VFV),
677cb81ef42Sxiaofeibao-xjtu    VFRSUB_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsub , F, T, F, UopSplitType.VEC_VFV),
678b448988dSczw
679b448988dSczw    // 13.3. Vector Widening Floating-Point Add/Subtract Instructions
680cb81ef42Sxiaofeibao-xjtu    VFWADD_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd, F, T, F, UopSplitType.VEC_VFW),
681cb81ef42Sxiaofeibao-xjtu    VFWSUB_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub, F, T, F, UopSplitType.VEC_VFW),
682cb81ef42Sxiaofeibao-xjtu    VFWADD_WF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd_w, F, T, F, UopSplitType.VEC_WFW),
683cb81ef42Sxiaofeibao-xjtu    VFWSUB_WF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub_w, F, T, F, UopSplitType.VEC_WFW),
684b448988dSczw
685b448988dSczw    // 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
686cb81ef42Sxiaofeibao-xjtu    VFMUL_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfma, VfmaType.vfmul, F, T, F, UopSplitType.VEC_VFV),
687cb81ef42Sxiaofeibao-xjtu    VFDIV_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfdiv, VfdivType.vfdiv, F, T, F, UopSplitType.VEC_VFV),
688cb81ef42Sxiaofeibao-xjtu    VFRDIV_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfdiv, VfdivType.vfdiv, F, T, F, UopSplitType.VEC_VFV),
689b448988dSczw
690b448988dSczw    // 13.5. Vector Widening Floating-Point Multiply
691cb81ef42Sxiaofeibao-xjtu    VFWMUL_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfma, VfmaType.vfmul_w, F, T, F, UopSplitType.VEC_VFW),
692b448988dSczw
693b448988dSczw    // 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions
694b19366b2Sxiaofeibao-xjtu    VFMACC_VF          -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.VEC_VFV),
695b19366b2Sxiaofeibao-xjtu    VFNMACC_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.VEC_VFV),
696b19366b2Sxiaofeibao-xjtu    VFMSAC_VF          -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.VEC_VFV),
697b19366b2Sxiaofeibao-xjtu    VFNMSAC_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.VEC_VFV),
698b19366b2Sxiaofeibao-xjtu    VFMADD_VF          -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmadd , F, T, F, UopSplitType.VEC_VFV),
699b19366b2Sxiaofeibao-xjtu    VFNMADD_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmadd, F, T, F, UopSplitType.VEC_VFV),
700b19366b2Sxiaofeibao-xjtu    VFMSUB_VF          -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmsub , F, T, F, UopSplitType.VEC_VFV),
701b19366b2Sxiaofeibao-xjtu    VFNMSUB_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmsub, F, T, F, UopSplitType.VEC_VFV),
702b448988dSczw
703b448988dSczw    // 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions
704b19366b2Sxiaofeibao-xjtu    VFWMACC_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmacc_w , F, T, F, UopSplitType.VEC_VFW),
705b19366b2Sxiaofeibao-xjtu    VFWNMACC_VF        -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc_w, F, T, F, UopSplitType.VEC_VFW),
706b19366b2Sxiaofeibao-xjtu    VFWMSAC_VF         -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmsac_w , F, T, F, UopSplitType.VEC_VFW),
707b19366b2Sxiaofeibao-xjtu    VFWNMSAC_VF        -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac_w, F, T, F, UopSplitType.VEC_VFW),
708b448988dSczw
709b448988dSczw    // 13.11. Vector Floating-Point MIN/MAX Instructions
710cb81ef42Sxiaofeibao-xjtu    VFMIN_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.VEC_VFV),
711cb81ef42Sxiaofeibao-xjtu    VFMAX_VF           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.VEC_VFV),
712b448988dSczw
713b448988dSczw    // 13.12. Vector Floating-Point Sign-Injection Instructions
714cb81ef42Sxiaofeibao-xjtu    VFSGNJ_VF          -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsgnj , F, T, F, UopSplitType.VEC_VFV),
715cb81ef42Sxiaofeibao-xjtu    VFSGNJN_VF         -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsgnjn, F, T, F, UopSplitType.VEC_VFV),
716cb81ef42Sxiaofeibao-xjtu    VFSGNJX_VF         -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsgnjx, F, T, F, UopSplitType.VEC_VFV),
717b448988dSczw
718b448988dSczw    // 13.13. Vector Floating-Point Compare Instructions
719f06d6d60Sxiaofeibao-xjtu    VMFEQ_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfeq, F, F, T, UopSplitType.VEC_VFM),
720f06d6d60Sxiaofeibao-xjtu    VMFNE_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfne, F, F, T, UopSplitType.VEC_VFM),
721f06d6d60Sxiaofeibao-xjtu    VMFLT_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vflt, F, F, T, UopSplitType.VEC_VFM),
722f06d6d60Sxiaofeibao-xjtu    VMFLE_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfle, F, F, T, UopSplitType.VEC_VFM),
723f06d6d60Sxiaofeibao-xjtu    VMFGT_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfgt, F, F, T, UopSplitType.VEC_VFM),
724f06d6d60Sxiaofeibao-xjtu    VMFGE_VF           -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfge, F, F, T, UopSplitType.VEC_VFM),
725b448988dSczw
726b448988dSczw    // 13.15. Vector Floating-Point Merge Instruction
727cb81ef42Sxiaofeibao-xjtu    VFMERGE_VFM        -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmerge, F, T, F, UopSplitType.VEC_VFV),
728b448988dSczw
729b448988dSczw    // 13.16. Vector Floating-Point Move Instruction
7306b6ab41bSZiyue Zhang    VFMV_V_F           -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmv, F, T, F, UopSplitType.VEC_VFV, src2 = SrcType.X), // vfmv.v.f vd, rs1 # vd[i] = f[rs1]
731b448988dSczw
732b448988dSczw    // 16.2. Floating-Point Scalar Move Instructions
7335110577fSZiyue Zhang    VFMV_F_S           -> OPFVF(SrcType.X, SrcType.X, FuType.vfalu, VfaluType.vfmv_f_s, T, F, F, UopSplitType.dummy), // f[rd] = vs2[0] (rs1=0)
7346b6ab41bSZiyue Zhang    VFMV_S_F           -> OPFVF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmv_s_f, F, T, F, UopSplitType.VEC_0XV, src2 = SrcType.X), // vd[0] = f[rs1] (vs2=0)
735b448988dSczw    // 16.3.3. Vector Slide1up
736e2695e90SzhanglyGit    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]
737b448988dSczw
738b448988dSczw    // 16.3.4. Vector Slide1down Instruction
739b448988dSczw    // vslide1down.vx vd, vs2, rs1, vm # vd[i] = vs2[i+1], vd[vl-1]=x[rs1]
740e2695e90SzhanglyGit    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]
7417f2b7720SXuan Hu  )
7427f2b7720SXuan Hu
743b65b9ebaSXuan Hu  val vset: Array[(BitPat, XSDecodeBase)] = Array(
7441436b764SZiyue Zhang    VSETVLI   -> VSET(vli = F, vtypei = T, VSETOpType.uvsetvcfg_xi, flushPipe = F, blockBack = F, SelImm.IMM_VSETVLI),
7451436b764SZiyue Zhang    VSETIVLI  -> VSET(vli = T, vtypei = T, VSETOpType.uvsetvcfg_ii, flushPipe = F, blockBack = F, SelImm.IMM_VSETIVLI),
7461436b764SZiyue Zhang    VSETVL    -> VSET(vli = F, vtypei = F, VSETOpType.uvsetvcfg_xx, flushPipe = T, blockBack = T, SelImm.X), // flush pipe
747912e2179SXuan Hu  )
7487f2b7720SXuan Hu
749b65b9ebaSXuan Hu  val vls: Array[(BitPat, XSDecodeBase)] = Array(
750912e2179SXuan Hu    // 7.4. Vector Unit-Stride Instructions
751c4501a6fSZiyue-Zhang    VLE8_V        -> VLD(SrcType.X,   VlduType.vle),
752c4501a6fSZiyue-Zhang    VLE16_V       -> VLD(SrcType.X,   VlduType.vle),
753c4501a6fSZiyue-Zhang    VLE32_V       -> VLD(SrcType.X,   VlduType.vle),
754c4501a6fSZiyue-Zhang    VLE64_V       -> VLD(SrcType.X,   VlduType.vle),
755c4501a6fSZiyue-Zhang    VSE8_V        -> VST(SrcType.X,   VstuType.vse),
756c4501a6fSZiyue-Zhang    VSE16_V       -> VST(SrcType.X,   VstuType.vse),
757c4501a6fSZiyue-Zhang    VSE32_V       -> VST(SrcType.X,   VstuType.vse),
758c4501a6fSZiyue-Zhang    VSE64_V       -> VST(SrcType.X,   VstuType.vse),
759c4501a6fSZiyue-Zhang    VLM_V         -> VLD(SrcType.X,   VlduType.vlm, mask = T),
760c4501a6fSZiyue-Zhang    VSM_V         -> VST(SrcType.X,   VstuType.vsm, mask = T),
761912e2179SXuan Hu    // 7.5. Vector Strided Instructions
762c4501a6fSZiyue-Zhang    VLSE8_V       -> VLD(SrcType.xp,  VlduType.vlse, uopSplitType = UopSplitType.VEC_S_LDST, strided = T),
763c4501a6fSZiyue-Zhang    VLSE16_V      -> VLD(SrcType.xp,  VlduType.vlse, uopSplitType = UopSplitType.VEC_S_LDST, strided = T),
764c4501a6fSZiyue-Zhang    VLSE32_V      -> VLD(SrcType.xp,  VlduType.vlse, uopSplitType = UopSplitType.VEC_S_LDST, strided = T),
765c4501a6fSZiyue-Zhang    VLSE64_V      -> VLD(SrcType.xp,  VlduType.vlse, uopSplitType = UopSplitType.VEC_S_LDST, strided = T),
766c4501a6fSZiyue-Zhang    VSSE8_V       -> VST(SrcType.xp,  VstuType.vsse, uopSplitType = UopSplitType.VEC_S_LDST, strided = T),
767c4501a6fSZiyue-Zhang    VSSE16_V      -> VST(SrcType.xp,  VstuType.vsse, uopSplitType = UopSplitType.VEC_S_LDST, strided = T),
768c4501a6fSZiyue-Zhang    VSSE32_V      -> VST(SrcType.xp,  VstuType.vsse, uopSplitType = UopSplitType.VEC_S_LDST, strided = T),
769c4501a6fSZiyue-Zhang    VSSE64_V      -> VST(SrcType.xp,  VstuType.vsse, uopSplitType = UopSplitType.VEC_S_LDST, strided = T),
770912e2179SXuan Hu    // 7.6. Vector Indexed Instructions
771c4501a6fSZiyue-Zhang    VLUXEI8_V     -> VLD(SrcType.vp,  VlduType.vluxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = F),
772c4501a6fSZiyue-Zhang    VLUXEI16_V    -> VLD(SrcType.vp,  VlduType.vluxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = F),
773c4501a6fSZiyue-Zhang    VLUXEI32_V    -> VLD(SrcType.vp,  VlduType.vluxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = F),
774c4501a6fSZiyue-Zhang    VLUXEI64_V    -> VLD(SrcType.vp,  VlduType.vluxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = F),
775c4501a6fSZiyue-Zhang    VLOXEI8_V     -> VLD(SrcType.vp,  VlduType.vloxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = T),
776c4501a6fSZiyue-Zhang    VLOXEI16_V    -> VLD(SrcType.vp,  VlduType.vloxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = T),
777c4501a6fSZiyue-Zhang    VLOXEI32_V    -> VLD(SrcType.vp,  VlduType.vloxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = T),
778c4501a6fSZiyue-Zhang    VLOXEI64_V    -> VLD(SrcType.vp,  VlduType.vloxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = T),
779e19ef7a0Szhanglinjuan    VSUXEI8_V     -> VST(SrcType.vp,  VstuType.vsuxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = F),
780c4501a6fSZiyue-Zhang    VSUXEI16_V    -> VST(SrcType.vp,  VstuType.vsuxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = F),
781c4501a6fSZiyue-Zhang    VSUXEI32_V    -> VST(SrcType.vp,  VstuType.vsuxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = F),
782c4501a6fSZiyue-Zhang    VSUXEI64_V    -> VST(SrcType.vp,  VstuType.vsuxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = F),
783c4501a6fSZiyue-Zhang    VSOXEI8_V     -> VST(SrcType.vp,  VstuType.vsoxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = T),
784c4501a6fSZiyue-Zhang    VSOXEI16_V    -> VST(SrcType.vp,  VstuType.vsoxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = T),
785c4501a6fSZiyue-Zhang    VSOXEI32_V    -> VST(SrcType.vp,  VstuType.vsoxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = T),
786c4501a6fSZiyue-Zhang    VSOXEI64_V    -> VST(SrcType.vp,  VstuType.vsoxe, uopSplitType = UopSplitType.VEC_I_LDST, indexed = T, ordered = T),
787912e2179SXuan Hu    // 7.7. Unit-stride Fault-Only-First Loads
788b0480352SZiyue Zhang    VLE8FF_V      -> VLD(SrcType.X,   VlduType.vleff, uopSplitType = UopSplitType.VEC_US_FF_LD, ff = T),
789b0480352SZiyue Zhang    VLE16FF_V     -> VLD(SrcType.X,   VlduType.vleff, uopSplitType = UopSplitType.VEC_US_FF_LD, ff = T),
790b0480352SZiyue Zhang    VLE32FF_V     -> VLD(SrcType.X,   VlduType.vleff, uopSplitType = UopSplitType.VEC_US_FF_LD, ff = T),
791b0480352SZiyue Zhang    VLE64FF_V     -> VLD(SrcType.X,   VlduType.vleff, uopSplitType = UopSplitType.VEC_US_FF_LD, ff = T),
792912e2179SXuan Hu    // 7.8. Vector Load/Store Segment Instructions
793912e2179SXuan Hu    // 7.8.1. Vector Unit-Stride Segment Loads and Stores
794912e2179SXuan Hu    // TODO
795912e2179SXuan Hu    // 7.8.2. Vector Strided Segment Loads and Stores
796912e2179SXuan Hu    // TODO
797912e2179SXuan Hu    // 7.8.3. Vector Indexed Segment Loads and Stores
798912e2179SXuan Hu    // TODO
799912e2179SXuan Hu    // 7.9. Vector Load/Store Whole Register Instructions
800c4501a6fSZiyue-Zhang    VL1RE8_V      -> VLD(SrcType.X,   VlduType.vlr, whole = T),
801c4501a6fSZiyue-Zhang    VL1RE16_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
802c4501a6fSZiyue-Zhang    VL1RE32_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
803c4501a6fSZiyue-Zhang    VL1RE64_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
804c4501a6fSZiyue-Zhang    VL2RE8_V      -> VLD(SrcType.X,   VlduType.vlr, whole = T),
805c4501a6fSZiyue-Zhang    VL2RE16_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
806c4501a6fSZiyue-Zhang    VL2RE32_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
807c4501a6fSZiyue-Zhang    VL2RE64_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
808c4501a6fSZiyue-Zhang    VL4RE8_V      -> VLD(SrcType.X,   VlduType.vlr, whole = T),
809c4501a6fSZiyue-Zhang    VL4RE16_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
810c4501a6fSZiyue-Zhang    VL4RE32_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
811c4501a6fSZiyue-Zhang    VL4RE64_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
812c4501a6fSZiyue-Zhang    VL8RE8_V      -> VLD(SrcType.X,   VlduType.vlr, whole = T),
813c4501a6fSZiyue-Zhang    VL8RE16_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
814c4501a6fSZiyue-Zhang    VL8RE32_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
815c4501a6fSZiyue-Zhang    VL8RE64_V     -> VLD(SrcType.X,   VlduType.vlr, whole = T),
816c4501a6fSZiyue-Zhang    VS1R_V        -> VST(SrcType.X,   VstuType.vsr, whole = T),
817c4501a6fSZiyue-Zhang    VS2R_V        -> VST(SrcType.X,   VstuType.vsr, whole = T),
818c4501a6fSZiyue-Zhang    VS4R_V        -> VST(SrcType.X,   VstuType.vsr, whole = T),
819c4501a6fSZiyue-Zhang    VS8R_V        -> VST(SrcType.X,   VstuType.vsr, whole = T),
820912e2179SXuan Hu  )
821912e2179SXuan Hu
822c8057e7cSXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = vset ++
823c06a3f03Szhanglinjuan    opivv ++ opivx ++ opivi ++ opmvv ++ opmvx ++ opfvv ++ opfvf ++ opfff ++ vls
8247f2b7720SXuan Hu}
825