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