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