1package xiangshan.backend.decode 2 3import chipsalliance.rocketchip.config.Parameters 4import chisel3._ 5import chisel3.util.BitPat.bitPatToUInt 6import chisel3.util._ 7import freechips.rocketchip.util.uintToBitPat 8import freechips.rocketchip.rocket.Instructions._ 9import utils._ 10import xiangshan.ExceptionNO.illegalInstr 11import xiangshan.backend.fu.FuType 12import xiangshan._ 13import yunsuan.{VfpuType, VipuType, VimacType, VpermType, VialuFixType, VfaluType, VfmaType, VfdivType} 14 15abstract class VecDecode extends XSDecodeBase { 16 def generate() : List[BitPat] 17 def asOldDecodeOutput(): List[BitPat] = { 18 val src1::src2::src3::fu::fuOp::xWen::fWen::vWen::mWen::vxsatWen::xsTrap::noSpec::blockBack::flushPipe::selImm::Nil = generate() 19 List (src1, src2, src3, fu, fuOp, xWen, fWen, xsTrap, noSpec, blockBack, flushPipe, selImm) 20 } 21 def asFirstStageDecodeOutput(): List[BitPat] = { 22 val src1::src2::src3::fu::fuOp::xWen::fWen::vWen::mWen::vxsatWen::xsTrap::noSpec::blockBack::flushPipe::selImm::Nil = generate() 23 List (src1, src2, src3, fu, fuOp, xWen, fWen, bitPatToUInt(vWen) | bitPatToUInt(mWen), xsTrap, noSpec, blockBack, flushPipe, selImm) 24 } 25} 26 27case class OPIVV(fu: FuType.OHType, fuOp: BitPat, vWen: Boolean, mWen: Boolean, vxsatWen: Boolean, uopSplitType: BitPat = UopSplitType.VEC_VVV, src3: BitPat = SrcType.vp) extends XSDecodeBase { 28 def generate() : List[BitPat] = { 29 XSDecode(SrcType.vp, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType, 30 xWen = F, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate() 31 } 32} 33 34case class OPIVX(fu: FuType.OHType, fuOp: BitPat, vWen: Boolean, mWen: Boolean, vxsatWen: Boolean, uopSplitType: BitPat = UopSplitType.VEC_VXV, src3: BitPat = SrcType.vp) extends XSDecodeBase { 35 def generate() : List[BitPat] = { 36 XSDecode(SrcType.xp, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType, 37 xWen = F, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate() 38 } 39} 40 41case class OPIVI(fu: FuType.OHType, fuOp: BitPat, vWen: Boolean, mWen: Boolean, vxsatWen: Boolean, selImm: BitPat = SelImm.IMM_OPIVIS, uopSplitType: BitPat = UopSplitType.VEC_VVV, src3: BitPat = SrcType.vp) extends XSDecodeBase { 42 def generate() : List[BitPat] = { 43 XSDecode(SrcType.imm, SrcType.vp, src3, fu, fuOp, selImm, uopSplitType, 44 xWen = F, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate() 45 } 46} 47 48case class OPMVV(vdRen: Boolean, fu: FuType.OHType, fuOp: BitPat, xWen: Boolean, vWen: Boolean, mWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase { 49 private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X 50 def generate() : List[BitPat] = { 51 XSDecode(SrcType.vp, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType, xWen, F, vWen, mWen, F, F, F, F).generate() 52 } 53} 54 55case class OPMVX(vdRen: Boolean, fu: FuType.OHType, fuOp: BitPat, xWen: Boolean, vWen: Boolean, mWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase { 56 private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X 57 def generate() : List[BitPat] = { 58 XSDecode(SrcType.xp, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType, 59 xWen = xWen, fWen = F, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate() 60 } 61} 62 63case class OPFVV(src1: BitPat, src3: BitPat, fu: FuType.OHType, fuOp: BitPat, fWen: Boolean, vWen: Boolean, mWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase { 64 def generate() : List[BitPat] = { 65 XSDecode(src1, SrcType.vp, src3, fu, fuOp, SelImm.X, uopSplitType, 66 xWen = F, fWen = fWen, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate() 67 } 68} 69 70case class OPFFF(src1: BitPat, src3: BitPat, fu: FuType.OHType, fuOp: BitPat, xWen: Boolean, fWen: Boolean, vWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase { 71 def generate() : List[BitPat] = { 72 XSDecode(src1, SrcType.fp, src3, fu, fuOp, SelImm.X, uopSplitType, 73 xWen = xWen, fWen = fWen, vWen = vWen, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F, canRobCompress = T).generate() 74 } 75} 76 77case class OPFVF(src1: BitPat, src3: BitPat, fu: FuType.OHType, fuOp: BitPat, fWen: Boolean, vWen: Boolean, mWen: Boolean, uopSplitType: BitPat = UopSplitType.dummy, src2: BitPat = SrcType.vp) extends XSDecodeBase { 78 def generate() : List[BitPat] = { 79 XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType, 80 xWen = F, fWen = fWen, vWen = vWen, mWen = mWen, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate() 81 } 82} 83 84case class VSET(vli: Boolean, vtypei: Boolean, fuOp: BitPat, flushPipe: Boolean, selImm: BitPat, uopSplitType: BitPat = UopSplitType.DIR) extends XSDecodeBase { 85 def generate() : List[BitPat] = { 86 val src1 = if (vli) SrcType.imm else SrcType.xp 87 val src2 = if (vtypei) SrcType.imm else SrcType.xp 88 XSDecode(src1, src2, SrcType.X, FuType.vsetiwf, fuOp, selImm, uopSplitType, 89 xWen = F, fWen = F, vWen = T, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = flushPipe).generate() 90 } 91} 92 93case class VLD(src2: BitPat, fuOp: BitPat, strided: Boolean = false, indexed: Boolean = false, ff: Boolean = false, 94 mask: Boolean = false, whole: Boolean = false, ordered: Boolean = false, uopSplitType: BitPat = UopSplitType.VEC_US_LD) extends XSDecodeBase { 95 def generate() : List[BitPat] = { 96 val fu = FuType.vldu 97 val src1 = SrcType.xp 98 val src3 = SrcType.X 99 XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType, 100 xWen = F, fWen = F, vWen = T, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate() 101 } 102} 103 104case class VST(src2: BitPat, fuOp: BitPat, strided: Boolean = false, indexed: Boolean = false, 105 mask: Boolean = false, whole: Boolean = false, ordered: Boolean = false, uopSplitType: BitPat = UopSplitType.dummy) extends XSDecodeBase { 106 def generate() : List[BitPat] = { 107 val fu = FuType.vstu 108 val src1 = SrcType.xp 109 val src3 = SrcType.vp 110 XSDecode(src1, src2, src3, fu, fuOp, SelImm.X, uopSplitType, 111 xWen = F, fWen = F, vWen = F, mWen = F, xsTrap = F, noSpec = F, blockBack = F, flushPipe = F).generate() 112 } 113} 114 115object VecDecoder extends DecodeConstants { 116 val opivv: Array[(BitPat, XSDecodeBase)] = Array( 117 VADD_VV -> OPIVV(FuType.vialuF, VialuFixType.vadd_vv, T, F, F), 118 VSUB_VV -> OPIVV(FuType.vialuF, VialuFixType.vsub_vv, T, F, F), 119 120 VMINU_VV -> OPIVV(FuType.vialuF, VialuFixType.vminu_vv, T, F, F), 121 VMIN_VV -> OPIVV(FuType.vialuF, VialuFixType.vmin_vv, T, F, F), 122 VMAXU_VV -> OPIVV(FuType.vialuF, VialuFixType.vmaxu_vv, T, F, F), 123 VMAX_VV -> OPIVV(FuType.vialuF, VialuFixType.vmax_vv, T, F, F), 124 125 VAND_VV -> OPIVV(FuType.vialuF, VialuFixType.vand_vv, T, F, F), 126 VOR_VV -> OPIVV(FuType.vialuF, VialuFixType.vor_vv, T, F, F), 127 VXOR_VV -> OPIVV(FuType.vialuF, VialuFixType.vxor_vv, T, F, F), 128 129 VRGATHER_VV -> OPIVV(FuType.vppu, VpermType.vrgather, T, F, F, UopSplitType.VEC_RGATHER), 130 VRGATHEREI16_VV -> OPIVV(FuType.vppu, VpermType.vrgatherei16, T, F, F, UopSplitType.VEC_RGATHEREI16), 131 132 VADC_VVM -> OPIVV(FuType.vialuF, VialuFixType.vadc_vvm, T, F, F), 133 VMADC_VVM -> OPIVV(FuType.vialuF, VialuFixType.vmadc_vvm, F, T, F, UopSplitType.VEC_VVM), 134 VMADC_VV -> OPIVV(FuType.vialuF, VialuFixType.vmadc_vv, F, T, F, UopSplitType.VEC_VVM), 135 136 VSBC_VVM -> OPIVV(FuType.vialuF, VialuFixType.vsbc_vvm, T, F, F), 137 VMSBC_VV -> OPIVV(FuType.vialuF, VialuFixType.vmsbc_vv, F, T, F, UopSplitType.VEC_VVM), 138 VMSBC_VVM -> OPIVV(FuType.vialuF, VialuFixType.vmsbc_vvm, F, T, F, UopSplitType.VEC_VVM), 139 140 VMERGE_VVM -> OPIVV(FuType.vialuF, VialuFixType.vmerge_vvm, T, F, F), 141 142 VMV_V_V -> OPIVV(FuType.vialuF, VialuFixType.vmv_v_v, T, F, F), 143 144 VMSEQ_VV -> OPIVV(FuType.vialuF, VialuFixType.vmseq_vv, F, T, F, UopSplitType.VEC_VVM), 145 VMSNE_VV -> OPIVV(FuType.vialuF, VialuFixType.vmsne_vv, F, T, F, UopSplitType.VEC_VVM), 146 VMSLTU_VV -> OPIVV(FuType.vialuF, VialuFixType.vmsltu_vv, F, T, F, UopSplitType.VEC_VVM), 147 VMSLT_VV -> OPIVV(FuType.vialuF, VialuFixType.vmslt_vv, F, T, F, UopSplitType.VEC_VVM), 148 VMSLEU_VV -> OPIVV(FuType.vialuF, VialuFixType.vmsleu_vv, F, T, F, UopSplitType.VEC_VVM), 149 VMSLE_VV -> OPIVV(FuType.vialuF, VialuFixType.vmsle_vv, F, T, F, UopSplitType.VEC_VVM), 150 151 VSLL_VV -> OPIVV(FuType.vialuF, VialuFixType.vsll_vv, T, F, F), 152 VSRL_VV -> OPIVV(FuType.vialuF, VialuFixType.vsrl_vv, T, F, F), 153 VSRA_VV -> OPIVV(FuType.vialuF, VialuFixType.vsra_vv, T, F, F), 154 VNSRL_WV -> OPIVV(FuType.vialuF, VialuFixType.vnsrl_wv, T, F, F, UopSplitType.VEC_WVV), 155 VNSRA_WV -> OPIVV(FuType.vialuF, VialuFixType.vnsra_wv, T, F, F, UopSplitType.VEC_WVV), 156 157 VSADDU_VV -> OPIVV(FuType.vialuF, VialuFixType.vsaddu_vv, T, F, T), 158 VSADD_VV -> OPIVV(FuType.vialuF, VialuFixType.vsadd_vv, T, F, T), 159 VSSUBU_VV -> OPIVV(FuType.vialuF, VialuFixType.vssubu_vv, T, F, T), 160 VSSUB_VV -> OPIVV(FuType.vialuF, VialuFixType.vssub_vv, T, F, T), 161 162 VSMUL_VV -> OPIVV(FuType.vimac, VimacType.vsmul, T, F, T, UopSplitType.VEC_VVV), 163 164 VSSRL_VV -> OPIVV(FuType.vialuF, VialuFixType.vssrl_vv, T, F, F), 165 VSSRA_VV -> OPIVV(FuType.vialuF, VialuFixType.vssra_vv, T, F, F), 166 167 VNCLIPU_WV -> OPIVV(FuType.vialuF, VialuFixType.vnclipu_wv, T, F, T, UopSplitType.VEC_WVV), 168 VNCLIP_WV -> OPIVV(FuType.vialuF, VialuFixType.vnclip_wv, T, F, T, UopSplitType.VEC_WVV), 169 170 VWREDSUMU_VS -> OPIVV(FuType.vipu, VipuType.vwredsumu_vs, T, F, F, UopSplitType.VEC_VWW), 171 VWREDSUM_VS -> OPIVV(FuType.vipu, VipuType.vwredsum_vs, T, F, F, UopSplitType.VEC_VWW), 172 ) 173 174 val opivx: Array[(BitPat, XSDecodeBase)] = Array( 175 VADD_VX -> OPIVX(FuType.vialuF, VialuFixType.vadd_vv, T, F, F), 176 VSUB_VX -> OPIVX(FuType.vialuF, VialuFixType.vsub_vv, T, F, F), 177 VRSUB_VX -> OPIVX(FuType.vialuF, VialuFixType.vrsub_vv, T, F, F), 178 179 VMINU_VX -> OPIVX(FuType.vialuF, VialuFixType.vminu_vv, T, F, F), 180 VMIN_VX -> OPIVX(FuType.vialuF, VialuFixType.vmin_vv, T, F, F), 181 VMAXU_VX -> OPIVX(FuType.vialuF, VialuFixType.vmaxu_vv, T, F, F), 182 VMAX_VX -> OPIVX(FuType.vialuF, VialuFixType.vmax_vv, T, F, F), 183 184 VAND_VX -> OPIVX(FuType.vialuF, VialuFixType.vand_vv, T, F, F), 185 VOR_VX -> OPIVX(FuType.vialuF, VialuFixType.vor_vv, T, F, F), 186 VXOR_VX -> OPIVX(FuType.vialuF, VialuFixType.vxor_vv, T, F, F), 187 188 VRGATHER_VX -> OPIVX(FuType.vppu, VpermType.vrgather_vx, T, F, F, UopSplitType.VEC_RGATHER_VX), 189 190 VSLIDEUP_VX -> OPIVX(FuType.vppu, VpermType.vslideup, T, F, F, UopSplitType.VEC_SLIDEUP), 191 VSLIDEDOWN_VX -> OPIVX(FuType.vppu, VpermType.vslidedown, T, F, F, UopSplitType.VEC_SLIDEDOWN), 192 193 VADC_VXM -> OPIVX(FuType.vialuF, VialuFixType.vadc_vvm, T, F, F), 194 VMADC_VXM -> OPIVX(FuType.vialuF, VialuFixType.vmadc_vvm, F, T, F, UopSplitType.VEC_VXM), 195 VMADC_VX -> OPIVX(FuType.vialuF, VialuFixType.vmadc_vv, F, T, F, UopSplitType.VEC_VXM), 196 VSBC_VXM -> OPIVX(FuType.vialuF, VialuFixType.vsbc_vvm, T, F, F), 197 VMSBC_VX -> OPIVX(FuType.vialuF, VialuFixType.vmsbc_vv, F, T, F, UopSplitType.VEC_VXM), 198 VMSBC_VXM -> OPIVX(FuType.vialuF, VialuFixType.vmsbc_vvm, F, T, F, UopSplitType.VEC_VXM), 199 200 VMERGE_VXM -> OPIVX(FuType.vialuF, VialuFixType.vmerge_vvm, T, F, F), 201 202 VMV_V_X -> OPIVX(FuType.vialuF, VialuFixType.vmv_v_v, T, F, F), 203 204 VMSEQ_VX -> OPIVX(FuType.vialuF, VialuFixType.vmseq_vv, F, T, F, UopSplitType.VEC_VXM), 205 VMSNE_VX -> OPIVX(FuType.vialuF, VialuFixType.vmsne_vv, F, T, F, UopSplitType.VEC_VXM), 206 VMSLTU_VX -> OPIVX(FuType.vialuF, VialuFixType.vmsltu_vv, F, T, F, UopSplitType.VEC_VXM), 207 VMSLT_VX -> OPIVX(FuType.vialuF, VialuFixType.vmslt_vv, F, T, F, UopSplitType.VEC_VXM), 208 VMSLEU_VX -> OPIVX(FuType.vialuF, VialuFixType.vmsleu_vv, F, T, F, UopSplitType.VEC_VXM), 209 VMSLE_VX -> OPIVX(FuType.vialuF, VialuFixType.vmsle_vv, F, T, F, UopSplitType.VEC_VXM), 210 VMSGTU_VX -> OPIVX(FuType.vialuF, VialuFixType.vmsgtu_vv, F, T, F, UopSplitType.VEC_VXM), 211 VMSGT_VX -> OPIVX(FuType.vialuF, VialuFixType.vmsgt_vv, F, T, F, UopSplitType.VEC_VXM), 212 213 VSLL_VX -> OPIVX(FuType.vialuF, VialuFixType.vsll_vv, T, F, F), 214 VSRL_VX -> OPIVX(FuType.vialuF, VialuFixType.vsrl_vv, T, F, F), 215 VSRA_VX -> OPIVX(FuType.vialuF, VialuFixType.vsra_vv, T, F, F), 216 VNSRL_WX -> OPIVX(FuType.vialuF, VialuFixType.vnsrl_wv, T, F, F, UopSplitType.VEC_WXV), 217 VNSRA_WX -> OPIVX(FuType.vialuF, VialuFixType.vnsra_wv, T, F, F, UopSplitType.VEC_WXV), 218 219 VSADDU_VX -> OPIVX(FuType.vialuF, VialuFixType.vsaddu_vv, T, F, T), 220 VSADD_VX -> OPIVX(FuType.vialuF, VialuFixType.vsadd_vv, T, F, T), 221 VSSUBU_VX -> OPIVX(FuType.vialuF, VialuFixType.vssubu_vv, T, F, T), 222 VSSUB_VX -> OPIVX(FuType.vialuF, VialuFixType.vssub_vv, T, F, T), 223 224 VSMUL_VX -> OPIVX(FuType.vimac, VimacType.vsmul, T, F, T, UopSplitType.VEC_VXV), 225 226 VSSRL_VX -> OPIVX(FuType.vialuF, VialuFixType.vssrl_vv, T, F, F), 227 VSSRA_VX -> OPIVX(FuType.vialuF, VialuFixType.vssra_vv, T, F, F), 228 229 VNCLIPU_WX -> OPIVX(FuType.vialuF, VialuFixType.vnclipu_wv, T, F, T, UopSplitType.VEC_WXV), 230 VNCLIP_WX -> OPIVX(FuType.vialuF, VialuFixType.vnclip_wv, T, F, T, UopSplitType.VEC_WXV), 231 ) 232 233 val opivi: Array[(BitPat, XSDecodeBase)] = Array( 234 VADD_VI -> OPIVI(FuType.vialuF, VialuFixType.vadd_vv, T, F, F), 235 VRSUB_VI -> OPIVI(FuType.vialuF, VialuFixType.vrsub_vv, T, F, F), 236 237 VAND_VI -> OPIVI(FuType.vialuF, VialuFixType.vand_vv, T, F, F), 238 VOR_VI -> OPIVI(FuType.vialuF, VialuFixType.vor_vv, T, F, F), 239 VXOR_VI -> OPIVI(FuType.vialuF, VialuFixType.vxor_vv, T, F, F), 240 241 VRGATHER_VI -> OPIVI(FuType.vppu, VpermType.vrgather, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_RGATHER), 242 243 VSLIDEUP_VI -> OPIVI(FuType.vppu, VpermType.vslideup, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_ISLIDEUP), 244 VSLIDEDOWN_VI -> OPIVI(FuType.vppu, VpermType.vslidedown, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_ISLIDEDOWN), 245 246 VADC_VIM -> OPIVI(FuType.vialuF, VialuFixType.vadc_vvm, T, F, F), 247 VMADC_VIM -> OPIVI(FuType.vialuF, VialuFixType.vmadc_vvm, T, F, F, uopSplitType = UopSplitType.VEC_VVM), 248 VMADC_VI -> OPIVI(FuType.vialuF, VialuFixType.vmadc_vv, T, F, F, uopSplitType = UopSplitType.VEC_VVM), 249 250 VMERGE_VIM -> OPIVI(FuType.vialuF, VialuFixType.vmerge_vvm, T, F, F), 251 252 VMV_V_I -> OPIVI(FuType.vialuF, VialuFixType.vmv_v_v, T, F, F), 253 254 VMSEQ_VI -> OPIVI(FuType.vialuF, VialuFixType.vmseq_vv, F, T, F, uopSplitType = UopSplitType.VEC_VVM), 255 VMSNE_VI -> OPIVI(FuType.vialuF, VialuFixType.vmsne_vv, F, T, F, uopSplitType = UopSplitType.VEC_VVM), 256 VMSLEU_VI -> OPIVI(FuType.vialuF, VialuFixType.vmsleu_vv, F, T, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_VVM), 257 VMSLE_VI -> OPIVI(FuType.vialuF, VialuFixType.vmsle_vv, F, T, F, uopSplitType = UopSplitType.VEC_VVM), 258 VMSGTU_VI -> OPIVI(FuType.vialuF, VialuFixType.vmsgtu_vv, F, T, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_VVM), 259 VMSGT_VI -> OPIVI(FuType.vialuF, VialuFixType.vmsgt_vv, F, T, F, uopSplitType = UopSplitType.VEC_VVM), 260 261 VSLL_VI -> OPIVI(FuType.vialuF, VialuFixType.vsll_vv, T, F, F, selImm = SelImm.IMM_OPIVIU), 262 VSRL_VI -> OPIVI(FuType.vialuF, VialuFixType.vsrl_vv, T, F, F, selImm = SelImm.IMM_OPIVIU), 263 VSRA_VI -> OPIVI(FuType.vialuF, VialuFixType.vsra_vv, T, F, F, selImm = SelImm.IMM_OPIVIU), 264 VNSRL_WI -> OPIVI(FuType.vialuF, VialuFixType.vnsrl_wv, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WVV), 265 VNSRA_WI -> OPIVI(FuType.vialuF, VialuFixType.vnsra_wv, T, F, F, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WVV), 266 267 VSADDU_VI -> OPIVI(FuType.vialuF, VialuFixType.vsaddu_vv, T, F, T, selImm = SelImm.IMM_OPIVIU), 268 VSADD_VI -> OPIVI(FuType.vialuF, VialuFixType.vsadd_vv, T, F, T), 269 270 VSSRL_VI -> OPIVI(FuType.vialuF, VialuFixType.vssrl_vv, T, F, F, selImm = SelImm.IMM_OPIVIU), 271 VSSRA_VI -> OPIVI(FuType.vialuF, VialuFixType.vssra_vv, T, F, F, selImm = SelImm.IMM_OPIVIU), 272 273 VNCLIPU_WI -> OPIVI(FuType.vialuF, VialuFixType.vnclipu_wv, T, F, T, selImm = SelImm.IMM_OPIVIU, uopSplitType = UopSplitType.VEC_WVV), 274 VNCLIP_WI -> OPIVI(FuType.vialuF, VialuFixType.vnclip_wv, T, F, T, uopSplitType = UopSplitType.VEC_WVV), 275 276 VMV1R_V -> OPIVI(FuType.vipu, VipuType.dummy, T, F, F), 277 VMV2R_V -> OPIVI(FuType.vipu, VipuType.dummy, T, F, F), 278 VMV4R_V -> OPIVI(FuType.vipu, VipuType.dummy, T, F, F), 279 VMV8R_V -> OPIVI(FuType.vipu, VipuType.dummy, T, F, F), 280 ) 281 282 val opmvv: Array[(BitPat, XSDecodeBase)] = Array( 283 VAADD_VV -> OPMVV(T, FuType.vialuF, VialuFixType.vaadd_vv, F, T, F, UopSplitType.VEC_VVV), 284 VAADDU_VV -> OPMVV(T, FuType.vialuF, VialuFixType.vaaddu_vv, F, T, F, UopSplitType.VEC_VVV), 285 VASUB_VV -> OPMVV(T, FuType.vialuF, VialuFixType.vasub_vv, F, T, F, UopSplitType.VEC_VVV), 286 VASUBU_VV -> OPMVV(T, FuType.vialuF, VialuFixType.vasubu_vv, F, T, F, UopSplitType.VEC_VVV), 287 VCOMPRESS_VM -> OPMVV(T, FuType.vppu, VpermType.vcompress, F, T, F, UopSplitType.VEC_COMPRESS), 288 VCPOP_M -> OPMVV(T, FuType.vipu, VipuType.vcpop_m, T, F, F, UopSplitType.VEC_M0X), 289 VDIV_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F), 290 VDIVU_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F), 291 VFIRST_M -> OPMVV(T, FuType.vipu, VipuType.vfirst_m, T, F, F, UopSplitType.VEC_M0X_VFIRST), 292 VID_V -> OPMVV(T, FuType.vipu, VipuType.vid_v, F, T, F, UopSplitType.VEC_MVV), 293 VIOTA_M -> OPMVV(T, FuType.vipu, VipuType.viota_m, F, T, F, UopSplitType.VEC_MVV), 294 295 VMACC_VV -> OPMVV(T, FuType.vimac, VimacType.vmacc, F, T, F, UopSplitType.VEC_VVV), 296 297 VMADD_VV -> OPMVV(T, FuType.vimac, VimacType.vmadd, F, T, F, UopSplitType.VEC_VVV), 298 VMAND_MM -> OPMVV(T, FuType.vialuF, VialuFixType.vmand_mm, F, T, F, UopSplitType.VEC_MMM), 299 VMANDN_MM -> OPMVV(T, FuType.vialuF, VialuFixType.vmandn_mm, F, T, F, UopSplitType.VEC_MMM), 300 VMNAND_MM -> OPMVV(T, FuType.vialuF, VialuFixType.vmnand_mm, F, T, F, UopSplitType.VEC_MMM), 301 VMNOR_MM -> OPMVV(T, FuType.vialuF, VialuFixType.vmnor_mm, F, T, F, UopSplitType.VEC_MMM), 302 VMOR_MM -> OPMVV(T, FuType.vialuF, VialuFixType.vmor_mm, F, T, F, UopSplitType.VEC_MMM), 303 VMORN_MM -> OPMVV(T, FuType.vialuF, VialuFixType.vmorn_mm, F, T, F, UopSplitType.VEC_MMM), 304 VMXNOR_MM -> OPMVV(T, FuType.vialuF, VialuFixType.vmxnor_mm, F, T, F, UopSplitType.VEC_MMM), 305 VMXOR_MM -> OPMVV(T, FuType.vialuF, VialuFixType.vmxor_mm, F, T, F, UopSplitType.VEC_MMM), 306 VMSBF_M -> OPMVV(T, FuType.vipu, VipuType.vmsbf_m, F, T, F, UopSplitType.VEC_M0M), 307 VMSIF_M -> OPMVV(T, FuType.vipu, VipuType.vmsif_m, F, T, F, UopSplitType.VEC_M0M), 308 VMSOF_M -> OPMVV(T, FuType.vipu, VipuType.vmsof_m, F, T, F, UopSplitType.VEC_M0M), 309 VMUL_VV -> OPMVV(T, FuType.vimac, VimacType.vmul, F, T, F, UopSplitType.VEC_VVV), 310 VMULH_VV -> OPMVV(T, FuType.vimac, VimacType.vmulh, F, T, F, UopSplitType.VEC_VVV), 311 VMULHSU_VV -> OPMVV(T, FuType.vimac, VimacType.vmulhsu, F, T, F, UopSplitType.VEC_VVV), 312 VMULHU_VV -> OPMVV(T, FuType.vimac, VimacType.vmulhu, F, T, F, UopSplitType.VEC_VVV), 313 314 VMV_X_S -> OPMVV(T, FuType.vipu, VipuType.dummy, T, F, F), 315 VNMSAC_VV -> OPMVV(T, FuType.vimac, VimacType.vnmsac, F, T, F, UopSplitType.VEC_VVV), 316 VNMSUB_VV -> OPMVV(T, FuType.vimac, VimacType.vnmsub, F, T, F, UopSplitType.VEC_VVV), 317 VREDAND_VS -> OPMVV(T, FuType.vipu, VipuType.vredand_vs, F, T, F, UopSplitType.VEC_VRED), 318 VREDMAX_VS -> OPMVV(T, FuType.vipu, VipuType.vredmax_vs, F, T, F, UopSplitType.VEC_VRED), 319 VREDMAXU_VS -> OPMVV(T, FuType.vipu, VipuType.vredmaxu_vs, F, T, F, UopSplitType.VEC_VRED), 320 VREDMIN_VS -> OPMVV(T, FuType.vipu, VipuType.vredmin_vs, F, T, F, UopSplitType.VEC_VRED), 321 VREDMINU_VS -> OPMVV(T, FuType.vipu, VipuType.vredminu_vs, F, T, F, UopSplitType.VEC_VRED), 322 VREDOR_VS -> OPMVV(T, FuType.vipu, VipuType.vredor_vs, F, T, F, UopSplitType.VEC_VRED), 323 VREDSUM_VS -> OPMVV(T, FuType.vipu, VipuType.vredsum_vs, F, T, F, UopSplitType.VEC_VRED), 324 VREDXOR_VS -> OPMVV(T, FuType.vipu, VipuType.vredxor_vs, F, T, F, UopSplitType.VEC_VRED), 325 VREM_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F), 326 VREMU_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F), 327 VSEXT_VF2 -> OPMVV(T, FuType.vialuF, VialuFixType.vsext_vf2, F, T, F, UopSplitType.VEC_EXT2), 328 VSEXT_VF4 -> OPMVV(T, FuType.vialuF, VialuFixType.vsext_vf4, F, T, F, UopSplitType.VEC_EXT4), 329 VSEXT_VF8 -> OPMVV(T, FuType.vialuF, VialuFixType.vsext_vf8, F, T, F, UopSplitType.VEC_EXT8), 330 VZEXT_VF2 -> OPMVV(T, FuType.vialuF, VialuFixType.vzext_vf2, F, T, F, UopSplitType.VEC_EXT2), 331 VZEXT_VF4 -> OPMVV(T, FuType.vialuF, VialuFixType.vzext_vf4, F, T, F, UopSplitType.VEC_EXT4), 332 VZEXT_VF8 -> OPMVV(T, FuType.vialuF, VialuFixType.vzext_vf8, F, T, F, UopSplitType.VEC_EXT8), 333 VWADD_VV -> OPMVV(T, FuType.vialuF, VialuFixType.vwadd_vv, F, T, F, UopSplitType.VEC_VVW), 334 VWADD_WV -> OPMVV(T, FuType.vialuF, VialuFixType.vwadd_wv, F, T, F, UopSplitType.VEC_WVW), 335 VWADDU_VV -> OPMVV(T, FuType.vialuF, VialuFixType.vwaddu_vv, F, T, F, UopSplitType.VEC_VVW), 336 VWADDU_WV -> OPMVV(T, FuType.vialuF, VialuFixType.vwaddu_wv, F, T, F, UopSplitType.VEC_WVW), 337 VWMACC_VV -> OPMVV(T, FuType.vimac, VimacType.vwmacc, F, T, F, UopSplitType.VEC_VVW), 338 VWMACCSU_VV -> OPMVV(T, FuType.vimac, VimacType.vwmaccsu, F, T, F, UopSplitType.VEC_VVW), 339 VWMACCU_VV -> OPMVV(T, FuType.vimac, VimacType.vwmaccu, F, T, F, UopSplitType.VEC_VVW), 340 VWMUL_VV -> OPMVV(T, FuType.vimac, VimacType.vwmul, F, T, F, UopSplitType.VEC_VVW), 341 VWMULSU_VV -> OPMVV(T, FuType.vimac, VimacType.vwmulsu, F, T, F, UopSplitType.VEC_VVW), 342 VWMULU_VV -> OPMVV(T, FuType.vimac, VimacType.vwmulu, F, T, F, UopSplitType.VEC_VVW), 343 VWSUB_VV -> OPMVV(T, FuType.vialuF, VialuFixType.vwsub_vv, F, T, F, UopSplitType.VEC_VVW), 344 VWSUB_WV -> OPMVV(T, FuType.vialuF, VialuFixType.vwsub_wv, F, T, F, UopSplitType.VEC_WVW), 345 VWSUBU_VV -> OPMVV(T, FuType.vialuF, VialuFixType.vwsubu_vv, F, T, F, UopSplitType.VEC_VVW), 346 VWSUBU_WV -> OPMVV(T, FuType.vialuF, VialuFixType.vwsubu_wv, F, T, F, UopSplitType.VEC_WVW), 347 ) 348 349 val opmvx: Array[(BitPat, XSDecodeBase)] = Array( 350 VAADD_VX -> OPMVX(T, FuType.vialuF, VialuFixType.vaadd_vv, F, T, F, UopSplitType.VEC_VXV), 351 VAADDU_VX -> OPMVX(T, FuType.vialuF, VialuFixType.vaaddu_vv, F, T, F, UopSplitType.VEC_VXV), 352 VASUB_VX -> OPMVX(T, FuType.vialuF, VialuFixType.vasub_vv, F, T, F, UopSplitType.VEC_VXV), 353 VASUBU_VX -> OPMVX(T, FuType.vialuF, VialuFixType.vasubu_vv, F, T, F, UopSplitType.VEC_VXV), 354 VDIV_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F), 355 VDIVU_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F), 356 VMACC_VX -> OPMVX(T, FuType.vimac, VimacType.vmacc, F, T, F, UopSplitType.VEC_VXV), 357 VMADD_VX -> OPMVX(T, FuType.vimac, VimacType.vmadd, F, T, F, UopSplitType.VEC_VXV), 358 VMUL_VX -> OPMVX(T, FuType.vimac, VimacType.vmul, F, T, F, UopSplitType.VEC_VXV), 359 VMULH_VX -> OPMVX(T, FuType.vimac, VimacType.vmulh, F, T, F, UopSplitType.VEC_VXV), 360 VMULHSU_VX -> OPMVX(T, FuType.vimac, VimacType.vmulhsu, F, T, F, UopSplitType.VEC_VXV), 361 VMULHU_VX -> OPMVX(T, FuType.vimac, VimacType.vmulhu, F, T, F, UopSplitType.VEC_VXV), 362 VMV_S_X -> OPMVX(T, FuType.vipu, VipuType.vmv_s_x, F, T, F, UopSplitType.VEC_0XV), 363 364 VNMSAC_VX -> OPMVX(T, FuType.vimac, VimacType.vnmsac, F, T, F, UopSplitType.VEC_VXV), 365 VNMSUB_VX -> OPMVX(T, FuType.vimac, VimacType.vnmsub, F, T, F, UopSplitType.VEC_VXV), 366 VREM_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F), 367 VREMU_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F), 368 369 VSLIDE1DOWN_VX -> OPMVX(T, FuType.vppu, VpermType.vslide1down, F, T, F, UopSplitType.VEC_SLIDE1DOWN), 370 VSLIDE1UP_VX -> OPMVX(T, FuType.vppu, VpermType.vslide1up, F, T, F, UopSplitType.VEC_SLIDE1UP), 371 VWADD_VX -> OPMVX(T, FuType.vialuF, VialuFixType.vwadd_vv, F, T, F, UopSplitType.VEC_VXW), 372 VWADD_WX -> OPMVX(T, FuType.vialuF, VialuFixType.vwadd_wv, F, T, F, UopSplitType.VEC_WXW), 373 VWADDU_VX -> OPMVX(T, FuType.vialuF, VialuFixType.vwaddu_vv, F, T, F, UopSplitType.VEC_VXW), 374 VWADDU_WX -> OPMVX(T, FuType.vialuF, VialuFixType.vwaddu_wv, F, T, F, UopSplitType.VEC_WXW), 375 376 // OutOfMemoryError 377 VWMACC_VX -> OPMVX(T, FuType.vimac, VimacType.vwmacc, F, T, F, UopSplitType.VEC_VXW), 378 VWMACCSU_VX -> OPMVX(T, FuType.vimac, VimacType.vwmaccsu, F, T, F, UopSplitType.VEC_VXW), 379 VWMACCU_VX -> OPMVX(T, FuType.vimac, VimacType.vwmaccu, F, T, F, UopSplitType.VEC_VXW), 380 381 VWMACCUS_VX -> OPMVX(T, FuType.vimac, VimacType.vwmaccus, F, T, F, UopSplitType.VEC_VXW), 382 VWMUL_VX -> OPMVX(T, FuType.vimac, VimacType.vwmul, F, T, F, UopSplitType.VEC_VXW), 383 VWMULSU_VX -> OPMVX(T, FuType.vimac, VimacType.vwmulsu, F, T, F, UopSplitType.VEC_VXW), 384 // Ok 385 VWMULU_VX -> OPMVX(T, FuType.vimac, VimacType.vwmulu, F, T, F, UopSplitType.VEC_VXW), 386 VWSUB_VX -> OPMVX(T, FuType.vialuF, VialuFixType.vwsub_vv, F, T, F, UopSplitType.VEC_VXW), 387 VWSUB_WX -> OPMVX(T, FuType.vialuF, VialuFixType.vwsub_wv, F, T, F, UopSplitType.VEC_WXW), 388 VWSUBU_VX -> OPMVX(T, FuType.vialuF, VialuFixType.vwsubu_vv, F, T, F, UopSplitType.VEC_VXW), 389 VWSUBU_WX -> OPMVX(T, FuType.vialuF, VialuFixType.vwsubu_wv, F, T, F, UopSplitType.VEC_WXW), 390 ) 391 392 val opfff: Array[(BitPat, XSDecodeBase)] = Array( 393 // Scalar Float Point 394 FADD_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.SCA_SIM), 395 FADD_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.SCA_SIM), 396 FSUB_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsub, F, T, F, UopSplitType.SCA_SIM), 397 FSUB_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsub, F, T, F, UopSplitType.SCA_SIM), 398 FEQ_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfeq , T, F, F, UopSplitType.SCA_SIM), 399 FLT_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vflt , T, F, F, UopSplitType.SCA_SIM), 400 FLE_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfle , T, F, F, UopSplitType.SCA_SIM), 401 FEQ_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfeq , T, F, F, UopSplitType.SCA_SIM), 402 FLT_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vflt , T, F, F, UopSplitType.SCA_SIM), 403 FLE_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfle , T, F, F, UopSplitType.SCA_SIM), 404 FMIN_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.SCA_SIM), 405 FMIN_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.SCA_SIM), 406 FMAX_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.SCA_SIM), 407 FMAX_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.SCA_SIM), 408 // donot wflags 409 FCLASS_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfclass, T, F, F, UopSplitType.SCA_SIM), 410 FCLASS_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfclass, T, F, F, UopSplitType.SCA_SIM), 411 FSGNJ_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnj , F, T, F, UopSplitType.SCA_SIM), 412 FSGNJ_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnj , F, T, F, UopSplitType.SCA_SIM), 413 FSGNJX_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnjx, F, T, F, UopSplitType.SCA_SIM), 414 FSGNJX_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnjx, F, T, F, UopSplitType.SCA_SIM), 415 FSGNJN_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnjn, F, T, F, UopSplitType.SCA_SIM), 416 FSGNJN_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfsgnjn, F, T, F, UopSplitType.SCA_SIM), 417 418 FMUL_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfma , VfmaType.vfmul, F, T, F, UopSplitType.SCA_SIM), 419 FMUL_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfma , VfmaType.vfmul, F, T, F, UopSplitType.SCA_SIM), 420 421 FDIV_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfdiv, VfdivType.vfdiv , F, T, F, UopSplitType.SCA_SIM), 422 FDIV_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfdiv, VfdivType.vfdiv , F, T, F, UopSplitType.SCA_SIM), 423 FSQRT_S -> OPFFF(SrcType.fp, SrcType.X, FuType.vfdiv, VfdivType.vfsqrt, F, T, F, UopSplitType.SCA_SIM), 424 FSQRT_D -> OPFFF(SrcType.fp, SrcType.X, FuType.vfdiv, VfdivType.vfsqrt, F, T, F, UopSplitType.SCA_SIM), 425 426 FMADD_S -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.SCA_SIM), 427 FMSUB_S -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.SCA_SIM), 428 FNMADD_S -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.SCA_SIM), 429 FNMSUB_S -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.SCA_SIM), 430 FMADD_D -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.SCA_SIM), 431 FMSUB_D -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.SCA_SIM), 432 FNMADD_D -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.SCA_SIM), 433 FNMSUB_D -> OPFFF(SrcType.fp, SrcType.fp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.SCA_SIM), 434 ) 435 436 val opfvv: Array[(BitPat, XSDecodeBase)] = Array( 437 // 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions 438 VFADD_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.VEC_VVV), 439 VFSUB_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsub, F, T, F, UopSplitType.VEC_VVV), 440 441 // 13.3. Vector Widening Floating-Point Add/Subtract Instructions 442 VFWADD_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd , F, T, F, UopSplitType.VEC_VVW), 443 VFWSUB_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub , F, T, F, UopSplitType.VEC_VVW), 444 VFWADD_WV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd_w, F, T, F, UopSplitType.VEC_WVW), 445 VFWSUB_WV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub_w, F, T, F, UopSplitType.VEC_WVW), 446 447 // 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions 448 VFMUL_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfma, VfmaType.vfmul, F, T, F, UopSplitType.VEC_VVV), 449 VFDIV_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfdiv, VfdivType.vfdiv , F, T, F, UopSplitType.VEC_VVV), 450 451 // 13.5. Vector Widening Floating-Point Multiply 452 VFWMUL_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfma, VfmaType.vfmul_w, F, T, F, UopSplitType.VEC_VVW), 453 454 // 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions 455 VFMACC_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.VEC_VVV), 456 VFNMACC_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.VEC_VVV), 457 VFMSAC_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.VEC_VVV), 458 VFNMSAC_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.VEC_VVV), 459 VFMADD_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmadd , F, T, F, UopSplitType.VEC_VVV), 460 VFNMADD_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmadd, F, T, F, UopSplitType.VEC_VVV), 461 VFMSUB_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmsub , F, T, F, UopSplitType.VEC_VVV), 462 VFNMSUB_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmsub, F, T, F, UopSplitType.VEC_VVV), 463 464 // 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions 465 VFWMACC_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmacc_w , F, T, F, UopSplitType.VEC_VVW), 466 VFWNMACC_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc_w, F, T, F, UopSplitType.VEC_VVW), 467 VFWMSAC_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfmsac_w , F, T, F, UopSplitType.VEC_VVW), 468 VFWNMSAC_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac_w, F, T, F, UopSplitType.VEC_VVW), 469 470 // 13.8. Vector Floating-Point Square-Root Instruction 471 VFSQRT_V -> OPFVV(SrcType.X , SrcType.vp , FuType.vfdiv, VfdivType.vfsqrt, F, T, F, UopSplitType.VEC_VVV), 472 473 // 13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction 474 VFRSQRT7_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 475 476 // 13.10. Vector Floating-Point Reciprocal Estimate Instruction 477 VFREC7_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 478 479 // 13.11. Vector Floating-Point MIN/MAX Instructions 480 VFMIN_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.VEC_VVV), 481 VFMAX_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.VEC_VVV), 482 483 // 13.12. Vector Floating-Point Sign-Injection Instructions 484 VFSGNJ_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsgnj , F, T, F, UopSplitType.VEC_VVV), 485 VFSGNJN_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsgnjn, F, T, F, UopSplitType.VEC_VVV), 486 VFSGNJX_VV -> OPFVV(SrcType.vp, SrcType.vp , FuType.vfalu, VfaluType.vfsgnjx, F, T, F, UopSplitType.VEC_VVV), 487 488 // 13.13. Vector Floating-Point Compare Instructions 489 VMFEQ_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfeq, F, T, F, UopSplitType.VEC_VVM), 490 VMFNE_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfne, F, T, F, UopSplitType.VEC_VVM), 491 VMFLT_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vflt, F, T, F, UopSplitType.VEC_VVM), 492 VMFLE_VV -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfle, F, T, F, UopSplitType.VEC_VVM), 493 494 // 13.14. Vector Floating-Point Classify Instruction 495 VFCLASS_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfalu, VfaluType.vfclass, F, T, F, UopSplitType.VEC_VVV), 496 497 // 13.17. Single-Width Floating-Point/Integer Type-Convert Instructions 498 VFCVT_XU_F_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 499 VFCVT_X_F_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 500 VFCVT_RTZ_XU_F_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 501 VFCVT_RTZ_X_F_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 502 VFCVT_F_XU_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 503 VFCVT_F_X_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 504 505 // 13.18. Widening Floating-Point/Integer Type-Convert Instructions 506 VFWCVT_XU_F_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 507 VFWCVT_X_F_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 508 VFWCVT_RTZ_XU_F_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 509 VFWCVT_RTZ_X_F_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 510 VFWCVT_F_XU_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 511 VFWCVT_F_X_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 512 VFWCVT_F_F_V -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 513 514 // ! 515 // 13.19. Narrowing Floating-Point/Integer Type-Convert Instructions 516 VFNCVT_XU_F_W -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 517 VFNCVT_X_F_W -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 518 VFNCVT_RTZ_XU_F_W -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 519 VFNCVT_RTZ_X_F_W -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 520 VFNCVT_F_XU_W -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 521 VFNCVT_F_X_W -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 522 VFNCVT_F_F_W -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 523 VFNCVT_ROD_F_F_W -> OPFVV(SrcType.X , SrcType.X , FuType.vfpu, VfpuType.dummy, F, T, F), 524 // 14.3. Vector Single-Width Floating-Point Reduction Instructions 525 VFREDOSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredosum, F, T, F, UopSplitType.VEC_VFREDOSUM), 526 VFREDUSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredusum, F, T, F, UopSplitType.VEC_VFRED), 527 VFREDMAX_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredmax , F, T, F, UopSplitType.VEC_VFRED), 528 VFREDMIN_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfredmin , F, T, F, UopSplitType.VEC_VFRED), 529 530 // 14.4. Vector Widening Floating-Point Reduction Instructions 531 VFWREDOSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfaluType.vfwredosum, F, T, F, UopSplitType.VEC_VFREDOSUM), 532 VFWREDUSUM_VS -> OPFVV(SrcType.vp, SrcType.vp, FuType.vfalu, VfpuType.dummy, F, T, F), 533 534 ) 535 536 val opfvf: Array[(BitPat, XSDecodeBase)] = Array( 537 // 13.2. Vector Single-Width Floating-Point Add/Subtract Instructions 538 VFADD_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfadd, F, T, F, UopSplitType.VEC_VFV), 539 VFSUB_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsub , F, T, F, UopSplitType.VEC_VFV), 540 VFRSUB_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsub , F, T, F, UopSplitType.VEC_VFV), 541 542 // 13.3. Vector Widening Floating-Point Add/Subtract Instructions 543 VFWADD_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd, F, T, F, UopSplitType.VEC_VFW), 544 VFWSUB_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub, F, T, F, UopSplitType.VEC_VFW), 545 VFWADD_WF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwadd_w, F, T, F, UopSplitType.VEC_WFW), 546 VFWSUB_WF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfwsub_w, F, T, F, UopSplitType.VEC_WFW), 547 548 // 13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions 549 VFMUL_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfma, VfmaType.vfmul, F, T, F, UopSplitType.VEC_VFV), 550 VFDIV_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfdiv, VfdivType.vfdiv, F, T, F, UopSplitType.VEC_VFV), 551 VFRDIV_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfdiv, VfdivType.vfdiv, F, T, F, UopSplitType.VEC_VFV), 552 553 // 13.5. Vector Widening Floating-Point Multiply 554 VFWMUL_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfma, VfmaType.vfmul_w, F, T, F, UopSplitType.VEC_VFW), 555 556 // 13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions 557 VFMACC_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmacc , F, T, F, UopSplitType.VEC_VFV), 558 VFNMACC_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc, F, T, F, UopSplitType.VEC_VFV), 559 VFMSAC_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmsac , F, T, F, UopSplitType.VEC_VFV), 560 VFNMSAC_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac, F, T, F, UopSplitType.VEC_VFV), 561 VFMADD_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmadd , F, T, F, UopSplitType.VEC_VFV), 562 VFNMADD_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmadd, F, T, F, UopSplitType.VEC_VFV), 563 VFMSUB_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmsub , F, T, F, UopSplitType.VEC_VFV), 564 VFNMSUB_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmsub, F, T, F, UopSplitType.VEC_VFV), 565 566 // 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions 567 VFWMACC_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmacc_w , F, T, F, UopSplitType.VEC_VFW), 568 VFWNMACC_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmacc_w, F, T, F, UopSplitType.VEC_VFW), 569 VFWMSAC_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfmsac_w , F, T, F, UopSplitType.VEC_VFW), 570 VFWNMSAC_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfma, VfmaType.vfnmsac_w, F, T, F, UopSplitType.VEC_VFW), 571 572 // 13.11. Vector Floating-Point MIN/MAX Instructions 573 VFMIN_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmin, F, T, F, UopSplitType.VEC_VFV), 574 VFMAX_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmax, F, T, F, UopSplitType.VEC_VFV), 575 576 // 13.12. Vector Floating-Point Sign-Injection Instructions 577 VFSGNJ_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsgnj , F, T, F, UopSplitType.VEC_VFV), 578 VFSGNJN_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsgnjn, F, T, F, UopSplitType.VEC_VFV), 579 VFSGNJX_VF -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfpuType.vfsgnjx, F, T, F, UopSplitType.VEC_VFV), 580 581 // 13.13. Vector Floating-Point Compare Instructions 582 VMFEQ_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfeq, F, F, T, UopSplitType.VEC_VFM), 583 VMFNE_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfne, F, F, T, UopSplitType.VEC_VFM), 584 VMFLT_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vflt, F, F, T, UopSplitType.VEC_VFM), 585 VMFLE_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfle, F, F, T, UopSplitType.VEC_VFM), 586 VMFGT_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfgt, F, F, T, UopSplitType.VEC_VFM), 587 VMFGE_VF -> OPFVF(SrcType.fp, SrcType.vp, FuType.vfalu, VfaluType.vfge, F, F, T, UopSplitType.VEC_VFM), 588 589 // 13.15. Vector Floating-Point Merge Instruction 590 VFMERGE_VFM -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmerge, F, T, F, UopSplitType.VEC_VFV), 591 592 // 13.16. Vector Floating-Point Move Instruction 593 VFMV_V_F -> OPFVF(SrcType.fp, SrcType.vp , FuType.vfalu, VfaluType.vfmv, F, T, F),// src2=SrcType.X 594 595 // 16.2. Floating-Point Scalar Move Instructions 596 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) 597 VFMV_S_F -> OPFVF(SrcType.fp, SrcType.X, FuType.vfalu, VfaluType.vfmv_s_f, F, T, F, UopSplitType.VEC_VFV, src2 = SrcType.X), 598 // 16.3.3. Vector Slide1up 599 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] 600 601 // 16.3.4. Vector Slide1down Instruction 602 // vslide1down.vx vd, vs2, rs1, vm # vd[i] = vs2[i+1], vd[vl-1]=x[rs1] 603 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] 604 ) 605 606 val vset: Array[(BitPat, XSDecodeBase)] = Array( 607 VSETVLI -> VSET(vli = F, vtypei = T, VSETOpType.uvsetvcfg_xi, F, SelImm.IMM_VSETVLI), 608 VSETIVLI -> VSET(vli = T, vtypei = T, VSETOpType.uvsetvcfg_ii, F, SelImm.IMM_VSETIVLI), 609 VSETVL -> VSET(vli = F, vtypei = F, VSETOpType.uvsetvcfg_xx, T, SelImm.X), // flush pipe 610 ) 611 612 val vls: Array[(BitPat, XSDecodeBase)] = Array( 613 // 7.4. Vector Unit-Stride Instructions 614 VLE8_V -> VLD(SrcType.X, VlduType.dummy), 615 VLE16_V -> VLD(SrcType.X, VlduType.dummy), 616 VLE32_V -> VLD(SrcType.X, VlduType.dummy), 617 VLE64_V -> VLD(SrcType.X, VlduType.dummy), 618 VSE8_V -> VST(SrcType.X, VstuType.dummy), 619 VSE16_V -> VST(SrcType.X, VstuType.dummy), 620 VSE32_V -> VST(SrcType.X, VstuType.dummy), 621 VSE64_V -> VST(SrcType.X, VstuType.dummy), 622 VLM_V -> VLD(SrcType.X, VlduType.dummy, mask = T), 623 VSM_V -> VST(SrcType.X, VstuType.dummy, mask = T), 624 // 7.5. Vector Strided Instructions 625 VLSE8_V -> VLD(SrcType.xp, VlduType.dummy, strided = T), 626 VLSE16_V -> VLD(SrcType.xp, VlduType.dummy, strided = T), 627 VLSE32_V -> VLD(SrcType.xp, VlduType.dummy, strided = T), 628 VLSE64_V -> VLD(SrcType.xp, VlduType.dummy, strided = T), 629 VSSE8_V -> VST(SrcType.xp, VstuType.dummy, strided = T), 630 VSSE16_V -> VST(SrcType.xp, VstuType.dummy, strided = T), 631 VSSE32_V -> VST(SrcType.xp, VstuType.dummy, strided = T), 632 VSSE64_V -> VST(SrcType.xp, VstuType.dummy, strided = T), 633 // 7.6. Vector Indexed Instructions 634 VLUXEI8_V -> VLD(SrcType.vp, VlduType.dummy, indexed = T, ordered = F), 635 VLUXEI16_V -> VLD(SrcType.vp, VlduType.dummy, indexed = T, ordered = F), 636 VLUXEI32_V -> VLD(SrcType.vp, VlduType.dummy, indexed = T, ordered = F), 637 VLUXEI64_V -> VLD(SrcType.vp, VlduType.dummy, indexed = T, ordered = F), 638 VLOXEI8_V -> VLD(SrcType.vp, VlduType.dummy, indexed = T, ordered = T), 639 VLOXEI16_V -> VLD(SrcType.vp, VlduType.dummy, indexed = T, ordered = T), 640 VLOXEI32_V -> VLD(SrcType.vp, VlduType.dummy, indexed = T, ordered = T), 641 VLOXEI64_V -> VLD(SrcType.vp, VlduType.dummy, indexed = T, ordered = T), 642 VSUXEI8_V -> VLD(SrcType.vp, VstuType.dummy, indexed = T, ordered = F), 643 VSUXEI16_V -> VST(SrcType.vp, VstuType.dummy, indexed = T, ordered = F), 644 VSUXEI32_V -> VST(SrcType.vp, VstuType.dummy, indexed = T, ordered = F), 645 VSUXEI64_V -> VST(SrcType.vp, VstuType.dummy, indexed = T, ordered = F), 646 VSOXEI8_V -> VST(SrcType.vp, VstuType.dummy, indexed = T, ordered = T), 647 VSOXEI16_V -> VST(SrcType.vp, VstuType.dummy, indexed = T, ordered = T), 648 VSOXEI32_V -> VST(SrcType.vp, VstuType.dummy, indexed = T, ordered = T), 649 VSOXEI64_V -> VST(SrcType.vp, VstuType.dummy, indexed = T, ordered = T), 650 // 7.7. Unit-stride Fault-Only-First Loads 651 VLE8FF_V -> VLD(SrcType.X, VlduType.dummy, ff = T), 652 VLE16FF_V -> VLD(SrcType.X, VlduType.dummy, ff = T), 653 VLE32FF_V -> VLD(SrcType.X, VlduType.dummy, ff = T), 654 VLE64FF_V -> VLD(SrcType.X, VlduType.dummy, ff = T), 655 // 7.8. Vector Load/Store Segment Instructions 656 // 7.8.1. Vector Unit-Stride Segment Loads and Stores 657 // TODO 658 // 7.8.2. Vector Strided Segment Loads and Stores 659 // TODO 660 // 7.8.3. Vector Indexed Segment Loads and Stores 661 // TODO 662 // 7.9. Vector Load/Store Whole Register Instructions 663 VL1RE8_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 664 VL1RE16_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 665 VL1RE32_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 666 VL1RE64_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 667 VL2RE8_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 668 VL2RE16_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 669 VL2RE32_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 670 VL2RE64_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 671 VL4RE8_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 672 VL4RE16_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 673 VL4RE32_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 674 VL4RE64_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 675 VL8RE8_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 676 VL8RE16_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 677 VL8RE32_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 678 VL8RE64_V -> VLD(SrcType.X, VlduType.dummy, whole = T), 679 VS1R_V -> VST(SrcType.X, VlduType.dummy, whole = T), 680 VS2R_V -> VST(SrcType.X, VlduType.dummy, whole = T), 681 VS4R_V -> VST(SrcType.X, VlduType.dummy, whole = T), 682 VS8R_V -> VST(SrcType.X, VlduType.dummy, whole = T), 683 ) 684 685 override val decodeArray: Array[(BitPat, XSDecodeBase)] = vset ++ vls ++ 686 opivv ++ opivx ++ opivi ++ opmvv ++ opmvx ++ opfvv ++ opfvf ++ opfff 687} 688