1package xiangshan.backend.decode 2 3import chipsalliance.rocketchip.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import freechips.rocketchip.util.uintToBitPat 7import utils._ 8import xiangshan.ExceptionNO.illegalInstr 9import xiangshan._ 10import freechips.rocketchip.rocket.Instructions._ 11 12abstract class VecType { 13 def X = BitPat("b?") 14 def N = BitPat("b0") 15 def Y = BitPat("b1") 16 def generate() : List[BitPat] 17 def asOldDecodeOutput(): List[BitPat] = { 18 val src1::src2::src3::fu::fuOp::xWen::fWen::vWen::mWen::xsTrap::noSpec::blockBack::flushPipe::selImm::Nil = generate() 19 List (src1, src2, src3, fu, fuOp, xWen, fWen, xsTrap, noSpec, blockBack, flushPipe, selImm) 20 } 21} 22 23case class OPIVV(fu: BitPat, fuOp: BitPat, vWen: Boolean, mWen: Boolean) extends VecType { 24 def generate() : List[BitPat] = { 25 List (SrcType.vp, SrcType.vp, SrcType.X, fu, fuOp, N, N, vWen.B, mWen.B, N, N, N, N, SelImm.X) 26 } 27} 28 29case class OPIVX() extends VecType { 30 def generate() : List[BitPat] = { null } 31} 32 33case class OPIVI() extends VecType { 34 def generate() : List[BitPat] = { null } 35} 36 37case class OPMVV(vdRen: Boolean, fu: BitPat, fuOp: BitPat, xWen: Boolean, vWen: Boolean, mWen: Boolean, others: Any) extends VecType { 38 private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X 39 def generate() : List[BitPat] = { 40 List (SrcType.vp, SrcType.vp, src3, fu, fuOp, xWen.B, N, vWen.B, mWen.B, N, N, N, N, SelImm.X) 41 } 42} 43 44case class OPMVX(vdRen: Boolean, fu: BitPat, fuOp: BitPat, xWen: Boolean, vWen: Boolean, mWen: Boolean, others: Any) extends VecType { 45 private def src3: BitPat = if (vdRen) SrcType.vp else SrcType.X 46 def generate() : List[BitPat] = { 47 List (SrcType.xp, SrcType.vp, src3, fu, fuOp, xWen.B, N, vWen.B, mWen.B, N, N, N, N, SelImm.X) 48 } 49} 50 51case class OPFVV() extends VecType { 52 def generate() : List[BitPat] = { null } 53} 54 55case class OPFVF(fu: BitPat, fuOp: BitPat, fWen: Boolean, vWen: Boolean, mWen: Boolean) extends VecType { 56 def generate() : List[BitPat] = { 57 List (SrcType.vp, SrcType.fp, SrcType.X, fu, fuOp, N, fWen.B, vWen.B, mWen.B, N, N, N, N, SelImm.X) 58 } 59} 60 61case class VSET() extends VecType { 62 def generate() : List[BitPat] = { null } 63} 64 65case class VLS() extends VecType { 66 def generate() : List[BitPat] = { null } 67} 68 69object VecDecoder extends DecodeConstants { 70 private def F = false 71 private def T = true 72 73 val opivvTable: Array[(BitPat, List[BitPat])] = Array( 74 VADD_VV -> OPIVV(FuType.vipu, VipuType.dummy, T, F).generate(), 75 76 VMSEQ_VV -> OPIVV(FuType.vipu, VipuType.dummy, F, T).generate(), 77 ) 78 79 val opivxTable: Array[(BitPat, List[BitPat])] = Array() 80 val opiviTable: Array[(BitPat, List[BitPat])] = Array() 81 82 val opmvv: Array[(BitPat, OPMVV)] = Array( 83 VAADD_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 84 VAADDU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 85 VASUB_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 86 VASUBU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 87 VCOMPRESS_VM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 88 VCPOP_M -> OPMVV(F, FuType.vipu, VipuType.dummy, T, F, F, T), 89 VDIV_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 90 VDIVU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 91 VFIRST_M -> OPMVV(F, FuType.vipu, VipuType.dummy, T, F, F, T), 92 VID_V -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 93 VIOTA_M -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 94 VMACC_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 95 VMADD_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 96 VMAND_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 97 VMANDN_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 98 VMNAND_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 99 VMNOR_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 100 VMOR_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 101 VMORN_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 102 VMXNOR_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 103 VMXOR_MM -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 104 VMSBF_M -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 105 VMSIF_M -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 106 VMSOF_M -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 107 VMUL_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 108 VMULH_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 109 VMULHSU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 110 VMULHU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 111 VMV_X_S -> OPMVV(F, FuType.vipu, VipuType.dummy, T, F, F, T), 112 VNMSAC_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 113 VNMSUB_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 114 VREDAND_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 115 VREDMAX_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 116 VREDMAXU_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 117 VREDMIN_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 118 VREDMINU_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 119 VREDOR_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 120 VREDSUM_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 121 VREDXOR_VS -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 122 VREM_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 123 VREMU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 124 VSEXT_VF2 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 125 VSEXT_VF4 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 126 VSEXT_VF8 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 127 VZEXT_VF2 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 128 VZEXT_VF4 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 129 VZEXT_VF8 -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 130 VWADD_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 131 VWADD_WV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 132 VWADDU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 133 VWADDU_WV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 134 VWMACC_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 135 VWMACCSU_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 136 VWMACCU_VV -> OPMVV(T, FuType.vipu, VipuType.dummy, F, T, F, T), 137 VWMUL_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 138 VWMULSU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 139 VWMULU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 140 VWSUB_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 141 VWSUB_WV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 142 VWSUBU_VV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T), 143 VWSUBU_WV -> OPMVV(F, FuType.vipu, VipuType.dummy, F, T, F, T) 144 ) 145 val opmvx: Array[(BitPat, OPMVX)] = Array( 146 VAADD_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 147 VAADDU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 148 VASUB_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 149 VASUBU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 150 VDIV_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 151 VDIVU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 152 VMACC_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 153 VMADD_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 154 VMUL_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 155 VMULH_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 156 VMULHSU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 157 VMULHU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 158 VMV_S_X -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 159 VNMSAC_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 160 VNMSUB_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 161 VREM_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 162 VREMU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 163 VSLIDE1DOWN_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 164 VSLIDE1UP_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 165 VWADD_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 166 VWADD_WX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 167 VWADDU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 168 VWADDU_WX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 169 VWMACC_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 170 VWMACCSU_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 171 VWMACCU_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 172 VWMACCUS_VX -> OPMVX(T, FuType.vipu, VipuType.dummy, F, T, F, T), 173 VWMUL_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 174 VWMULSU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 175 VWMULU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 176 VWSUB_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 177 VWSUB_WX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 178 VWSUBU_VX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T), 179 VWSUBU_WX -> OPMVX(F, FuType.vipu, VipuType.dummy, F, T, F, T) 180 ) 181 val opmvvTable: Array[(BitPat, List[BitPat])] = opmvv.map(x => (x._1, x._2.generate())) 182 val opmvxTable: Array[(BitPat, List[BitPat])] = opmvx.map(x => (x._1, x._2.generate())) 183 184 val opfvvTable: Array[(BitPat, List[BitPat])] = Array() 185 186 val opfvfTable: Array[(BitPat, List[BitPat])] = Array( 187 VFADD_VF -> OPFVF(FuType.vfpu, VfpuType.dummy, F, T, F).generate(), 188 VMFEQ_VF -> OPFVF(FuType.vfpu, VfpuType.dummy, F, F, T).generate(), 189 ) 190 191 val vsetTable: Array[(BitPat, List[BitPat])] = Array() 192 val vlsTable: Array[(BitPat, List[BitPat])] = Array() 193 194 val table = opivvTable ++ opivxTable ++ opiviTable ++ 195 opmvvTable ++ opmvxTable ++ 196 opfvvTable ++ opfvfTable ++ 197 vsetTable ++ vlsTable 198} 199